Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder einen alternativen Browser verwenden.
@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
@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.
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):
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.
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?
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.
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...
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.