Dynam. Array zeigt Visual Studio nicht als solches an.
-
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!"
-
bgdnoy schrieb:
Langsam geht mir mein gcc schon auf die Nerven
man muss den gcc ja nicht unbedingt benutzen. meistens gibt es bessere alternativen, ausser vielleicht unter unixoiden systemen.
-
naja, die Deklaration von unsigned char[0] ist nicht so ungewöhnlich. macht man normalerweise, wenn man Datenpakete variabler Länge hat.
Bsp:
struct MyPacket { uint32 type; uint32 length; uint8 data[0]; }
Hab ich schon oft in µC und DSP Headern gesehen.
wahrscheinlich gibt der gcc deswegen auch keinen Warnung aus, weil sich sonst ne menge Leute aufregen würden, sinnvoll wärs in meinen Augen schon.
-
Danke für eure Antworten.
Wie seiht es aus, wenn ich ein 2D-Array so dynamisch erzeugen lasse.
arr,10,10 funktioniert leider nicht, umd Visual Studio zu zwingen, es wie ein 10x10 Array anzuzeigen.