Sono il seguente programma:Array dichiarato come int v [100], ma e (v [100]) non avverte
#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;
}
E questa è l'uscita del gcc --version
sul terminale:
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
Perché ottenere l'indirizzo dell'elemento dopo l'ultima di una serie mi dà nessun avvertimento ma ottenere ad esempio l'indirizzo del v[101]
mi dà il seguente avviso
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.
So che gli elementi di indicizzazione fuori dai limiti di un buffer sono comportamento non definito, quindi perché il compilatore non si lamenta del primo caso?
Il programma invocherà * comportamento non definito * se vengono letti solo zero caratteri prima di EOF. – MikeCAT
Non dovresti decrementare 'p' su' EOF'. – chqrlie
@chqrlie Dici questo perché nel seguente ciclo while prima decremento 'p' e poi dereferenziarlo? – nbro