Proč sizeof n-prvkového pole vyplivne 4ku? – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Proč sizeof n-prvkového pole vyplivne 4ku? – C / C++ – Fórum – Programujte.comProč sizeof n-prvkového pole vyplivne 4ku? – C / C++ – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené — příspěvek s řešením.
Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
ondrej39+1
Věrný člen
12. 11. 2014   #1
-
0
-

Ahoj, nemohl by mi někdo vysvětlit, proč mi ve funkci tiskPole vrací sizeof(pole) velikost 4, namísto skutečné velikosti pole samotného (v mém případě 14 prvků, tedy 14 * 4 = 56, 56 je číslo, které bych očekával), tedy vrací velikost typu int. Zdrojový kód:

#include "stdafx.h"
#include <iostream>
using namespace std;

void tiskPole(int pole[])
{
	int velik = sizeof(pole) / sizeof(int);
	for (int i = 0; i < velik; i++)
	{
		cout << pole[i] << endl;
	}
}

int _tmain(int argc, _TCHAR* argv[])
{
	int pole[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14 };

	tiskPole(pole);
}


Nejvíce mne zaráží, že když přímo do mainu dopíši např.

int velik_test = sizeof(pole);

do proměnné velik_test se správně přiřadí 56, nikoli 4. Jak to, že to ve funkci nefunguje?

Díky za radu.

Nahlásit jako SPAM
IP: 46.39.172.–
Inject all the dependencies!
Reklama
Reklama
Řešení
KIIV+42
God of flame
12. 11. 2014   #2
-
0
-
Vyřešeno Nejlepší odpověď

Protoze int pole[] jako parametr funkce uz je brano jen jako pointer. Musel bys mit bud nejakou ukoncovaci hodnotu, nebo predat pocet prvku.
 

Nahlásit jako SPAM
IP: 94.113.95.–
Program vždy dělá to co naprogramujete, ne to co chcete...
ondrej39+1
Věrný člen
13. 11. 2014   #3
-
0
-

#2 KIIV

KIIVe, s tou zarážkou (resp. ukončovací hodnotou) to myslíš tak, že bych měl si nadefinoval třeba int cnt;, poté cyklus, kterým bych pole procházel a třeba (pole[i] != "\0") cnt++;, přičemž v daném cyklu ze zdrojového kódu v první příspěvku by poté proměnná velik byla nahrazena proměnnou cnt.

Nahlásit jako SPAM
IP: 46.39.172.–
Inject all the dependencies!
KIIV+42
God of flame
13. 11. 2014   #4
-
0
-

#3 ondrej39
neco takoveho.. jen bacha treba na  "\0" - to by porovnavalo s adresou toho retezce.. pokud chces treba znak, tak se to dela pomoci apostrofu '\0'

Ale samozrejme to jde lip u pole ukazatelu - tam se da dat jako ukoncovaci hodnota extra prvek s NULL

Nebo proste drzet tu velikost rovnou a predat ji te funkci

Nahlásit jako SPAM
IP: 94.113.95.–
Program vždy dělá to co naprogramujete, ne to co chcete...
ondrej39+1
Věrný člen
13. 11. 2014   #5
-
0
-

#4 KIIV

Jojo, napadlo mě, že velikost se samozřejmě může přidat rovnou jako parametr, potom by to fungovalo i dynamicky, následovně:

#include "stdafx.h"
#include <iostream>
using namespace std;

void tiskPole(int pole[], int velik)
{
	for (int i = 0; i < velik; i++)
	{
		cout << pole[i] << endl;
	}
}

int _tmain(int argc, _TCHAR* argv[])
{
	int pole[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14 };
	int velikost = sizeof(pole) / sizeof(int);
	tiskPole(pole, velikost);
}

Ale tam je zas problém, že by sis vytvořil třeba int pole2[] = { něco } a pokud bys ho chtěl vytisknout, tak zase musíš definovat i tu velikost, namísto abys jen napsal tiskPole(pole2);. Každopádně mě jen zajímalo, proč tam dochází ke špatnému přiřazování té velikosti, což jsi mi vysvětlil.

Díky moc.

Nahlásit jako SPAM
IP: 46.39.172.–
Inject all the dependencies!
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 81 hostů

Podobná vlákna

Sizeof — založil p4f

Sizeof — založil Avidius

Sizeof — založil sexmachina

Sizeof bool — založil Porcepoque

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý