Dynam. Array zeigt Visual Studio nicht als solches an.
-
das ist so wie mit dem teilchen/welle-dualismus.
-
dlgig2 schrieb:
Andere Entwicklungsumgebungen zeigen den Inhalt problemlos an.
ja, manche debugger zeigen den speicherbereich, auf den ein pointer zeigt, fortlaufend an. beim msvc-debugger könntest du z.b. ein memory-window aufmachen, '*dein_pointer' eingeben und die ansicht auf 'int' schalten.
-
-
im watchfenster, kannst du die anzeige als array erzwingen, indem du hinter den pointer-ausdruck ein ",x" schreibst, wobei x, die anzahl der anzuzeigenden Elemente ist.
also zB
arr, 10
zeigt arr an, als wärs ein array mit 10 elementen.
-
flamer schrieb:
Es ist kein Array, sondern ein Speicherbereich.
Aber da gehen wir in die pedantische Richtung.
Argument für meine Ausdrucksweise:char *p = malloc(1);
Da hab ich ein einziges Byte, das kann niemals ein Array sein, oder?
Seit C99 assoziieren wir dynamsches Array eher mit sowas:
int i = (int)clock(); char p[i];
Siehe Titel. Visual Studio kennt AFAIK kein C99
-
flamer schrieb:
char *p = malloc(1);
Da hab ich ein einziges Byte, das kann niemals ein Array sein, oder?
Ist das hier:
char p[1];
dann auch kein Array?
-
dann auch kein Array?
Davor hab ich mich schon gefürchtet.
Keine Ahnung...
-
Belli schrieb:
char p[1];
dann auch kein Array?
doch, ist es. die eckigen klammern machen es zum array, nicht die zahl die darin steht.
-
flamer schrieb:
Davor hab ich mich schon gefürchtet.
lol
-
Mein GCC frisst sogar folgendes:
char arr[0];
Darf er das, so ganz ohne Warnung (auf dem höchsten Warnlevel)?
-
bgdnoy schrieb:
Mein GCC frisst sogar folgendes:
das ist bestimmt ein bug. setz doch mal eine negative zahl oder eine fliesskommazahl ein.
-
fricky schrieb:
das ist bestimmt ein bug.
Scheinbar...
char arr[-1];
Beim Compilen:
main.c: In function `main': main.c:8: error: size of array `arr' is negative main.c:8: warning: unused variable `arr' ...
Aber:
char arr[0];
Beim Compilen:
main.c: In function `main': main.c:8: warning: unused variable `arr' ...
Seltsam, oder?
-
dann benutz doch mal das 0-array. was mach der blöde gcc mit:
int arr[0]; arr[0] = irgendwas;
^^sollte schiefgehen, weil das array ja keine elemente hat.
-
Ich bin mir nicht sicher, ob der blöde gcc da meckert.
Oder würde erint arr[5]; arr [5] = 1;
auch anmeckern?
-
Belli schrieb:
Ich bin mir nicht sicher, ob der blöde gcc da meckert.
Oder würde erint arr[5]; arr [5] = 1;
auch anmeckern?
nein, ein compilefehler gibt's hier nicht, aber ich nehme an, einen 'off-by-one' fehler, der zur laufzeit passiert bei:
int a[0]; a[0] =1;
-
char vorher[8]; char arr[0]; char nachher[8]; arr[0] = 42; printf("%d\n", arr[0]); printf("vorher: %d, arr: %d, nachher: %d", vorher, arr, nachher);
Geht durch, ohne Warnungen wegen arr.
Ausgabe:42 vorher: 2293608, arr: 2293584, nachher: 2293576
Bin aber gerade draufgekommen, daß auf meiner Windows-Kiste der Compiler schon 4 Jahre alt ist...
Das ist noch der von Dev-Cpp: gcc (GCC) 3.4.2 (mingw-special)
Werd mal nachsehen, was ein neuerer dazu sagt...
-
ich habs grad mal auf 'nem 1/2 jahr alten linux/debian probiert. das programm schmiert ab (bus error).
-
^^ GCC version 4.1.2
-
Dass der gcc bei
T foo[0]
nicht standardmäßig warnt liegt daran, dass es ein Feature ist um einen Mechanismus wie die in C99 neuen "flexible array members" schon vor C99 (und auch in C++) zu "unterstützen". Mit einem -pedantic warnt der gcc das aber sicher an.
-
Dass der gcc bei T foo[0] nicht standardmäßig warnt liegt daran, dass es ein Feature ist um einen Mechanismus wie die in C99 neuen "flexible array members" schon vor C99 (und auch in C++) zu "unterstützen". Mit einem -pedantic warnt der gcc das aber sicher an.
So ist es:
main.c:8: warning: ISO C forbids zero-size array `arr'
It's a feature!
Danke jedenfalls.FSFE hin oder her:
Langsam geht mir mein gcc schon auf die Nerven: ich hätte manchmal doch gerne einfach
einen Schalter, der bedeutet: "Ich bin dummer N00b, pass auf mich auf!"