C sizeof()-Operator spinnt?

@foggy80: Nein, mit alloziiertem speicher hat das rein gar nichts zu tun. tabelle ist für den Compiler KEIN pointer, sondern ein array. wenn du ein Array kopieren willst, musst du memcpy benutzen. Einfaches zuweisen (x = y) kopiert NICHT den inhalt.
 
es wurde eigentlich bereits alles gesagt: wird ein array deklariert, so wird dies stets auf dem stack alloziert. die größe eines arrays ist nicht variabel und bleibt konstant, daher kann die größe einfach ausgegeben werden. sofern die erlaubte stackgröße für einen prozess nicht im kernel geändert wird, können in einer funktion daher auch keine riesigen arrays angelegt werden. das macht man stets mit malloc.

via malloc wird speicher auf dem wesentlich größeren heap alloziert. wird der pointer nicht gerade als static deklariert, kann der speicherbereich, auf den der pointer zeigt, nach gutdünken ausgetauscht werden, sofern die typen kompatibel sind. soll heißen: sizeof() gibt nicht die größe eines dynamischen speicherbereichs aus.
 
@herzog: also beim einen mal wird 4 ausgegeben und die 10 ist noch nicht bekannt, das ist schön, das weiß ich, und das musst du mir jetzt nicht nochmal erklären ;) :p

@ice-breaker: ist das so? okay, dann ist das problem gelöst.

demnach wäre die richtige antwort gewesen: dass beim einen mal 10 ausgegeben wird ist die norm, das muss so sein und dass beim anderen mal 4 ausgegeben wird ist die Ausnahme, denn die 4 wird ausgegeben weil die 10 zur compilezeit nicht bekannt ist.

denn: laut meiner fragestellung bin ich davon ausgegangen dass die ausgegebene 4 die norm ist, dann wäre aber die ausgegebene 10 keine ausnahme, da die größe des pointers zur compilezeit bekannt ist. diese frage hat nun ice-breaker beantwortet indem er sagt: "nein, die 10 ist die norm, nicht die 4!". vielen dank dafür.

@Maekloev: Okay, das erklärt dann auch warum das so ist.
 
Zuletzt bearbeitet:
Du brauchst nicht so emotional zu reagieren ;) Das es ist wie es ist wurde in etwa jedem 2ten Beitrag gesagt :)
 
vgl. auch diesen link hier: das wäre eine interessante möglichkeit, die größe des dynamischen speicherbereichs an den beginn des speichers zu schreiben (zumindest für den datentyp int):

http://stackoverflow.com/questions/...-a-pointer-pointing-to-an-array/492410#492410

wenn die größe wirklich benötigt wird, wäre eine alternative vielleicht auch ein struct, das aus einem int sowie einem pointer beliebigen typs besteht.
 
So wirklich zu verstehen scheinst du es zwar immernoch nicht ;)

Hier noch ein anderer, gleicher Fall:

struct sockaddr blubb;
sizeof(blubb) == 16, nicht 4.

Auch hier: Natürlich ist hintenrum effektiv ein Pointer am werkeln. Aber du deklariertst nunmal eine instanz der struktur, nicht einen pointer.
 
Jein heißt du weißt es nicht! Was ist denn der unterschied von char * und char[] außer dass es das eine mal auf einen nichtveränderbaren speicher im stack zeigt und das andere mal irgndwo in den heap?
 
Zuletzt bearbeitet:
Jein heisst:

char tabelle[10];
char *blah;

blah = tabelle; <-- funktioniert
blah = &tabelle[0]; <-- dasselbe

andersrum funktioniert es nicht. du koenntest es per cast forcieren, und es wuerde funktionieren, aber, der compiler schuetzt dich mit einer compilerwarnung davor, dass du solches faelschlicherweise umsetzt.

tabelle = blah; <-- geht nicht.

Edit: Der unterschied ist der typ. Eins ist ein Array, das andere ein Pointer.
 
Zuletzt bearbeitet:
und wieso funktioniert tabelle = blah nicht? ein schlauer compiler würde das doch einfach nur zulassen!

btw: durch das mir nun inzwischen eingeschobene wissen ist mir aufgefallen dass eine verkettete liste einem array von strings zu bevorzugen ist, vor allem weil die anzahl der strings dann während der laufzeit verändert werden kann...
 
Zuletzt bearbeitet:
Ein compiler solll dich vor Fehlern schützen.

Und auch ein per malloc erstelltes array kannst du resizen (realloc). Will damit aber nicht sagen, dass dies für alles die Lösung wäre. Verkettete Listen haben schon so ihre Daseinsberechtigung.
 
Zuletzt bearbeitet:
Ja.

Eh, aber, char tabelle[] = malloc... geht natuerlich nicht. da musst schon char *tabelle machen.
 
Zuletzt bearbeitet:
Es ist insofern nicht ganz richtig, dass mit const deklarierte werte nicht aufm stack liegen.
 
Ja, ich mein ja nur, die generelle Aussage stimmt so nicht. Aber im Bezug auf diesen Thread, "ja".
 
Zurück
Oben