mam następujący program:Array zadeklarowane jako int v [100], ale i (v [100]) daje żadnego ostrzeżenia
#include <stdio.h>
int main() {
int v[100];
int *p;
for (p = &(v[0]); p != &(v[100]); ++p)
if ((*p = getchar()) == EOF) {
--p;
break;
}
while (p != v)
putchar(*--p);
return 0;
}
i to jest wyjście gcc --version
na terminalu:
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 7.0.2 (clang-700.1.81)
Target: x86_64-apple-darwin15.3.0
Thread model: posix
Dlaczego coraz adres elementu po ostatnim tablicy daje mi żadnego ostrzeżenia, ale się na przykład adres v[101]
daje mi następujące ostrzeżenie
test.c:8:29: warning: array index 101 is past the end of the array (which
contains 100 elements) [-Warray-bounds]
for(p = &(v[0]); p != &(v[101]); ++p)
^~~~
test.c:5:5: note: array 'v' declared here
int v[100];
^
1 warning generated.
Wiem, że elementy indeksujące poza obszarem bufora to niezdefiniowane zachowanie, dlaczego więc kompilator nie narzeka na pierwszy przypadek?
Twój program wywoła * niezdefiniowane zachowanie *, jeśli odczytane zostaną tylko zero znaków przed EOF. – MikeCAT
Nie powinieneś zmniejszać 'p' na' EOF'. – chqrlie
@chqrlie Mówisz tak, ponieważ w następującej pętli I najpierw zmniejszam 'p', a następnie usuwam z niej dereferencję? – nbro