Я пробовал кусок кода, который делал переполнение массива, но произошло что-то неожиданное, когда я скомпилировал его с помощью gcc. Ниже приведен код:Что было сделано gcc, когда я пытаюсь сделать переполнение массива?
#include <stdio.h>
int main(int argc, const char *argv[])
{
int a[] = {0,2,4,7};
int size = sizeof(a)/sizeof(int);
int i;
printf("%d, %X\n", size, &a);
a[4] = 6;
printf("%d, %X\n", size, &a);
a[5] = 78;
printf("%d, %X\n", size, &a);
a[6] = 65;
printf("%d, %X\n", size, &a);
for (i = 0; i < size; i++) {
printf("%d, ", a[i]);
}
printf("%d, %d, %d\n", a[size], a[size+1], a[size+2]);
printf("\n");
return 0;
}
и результат:
4, BFC4DDF8
6, BFC4DDF8
6, BFC4DDF8
6, BFC4DDF8
0, 2, 4, 7, 6, 5, 65, 0, 0
Так в коде, я не изменил значение размера, но когда он бежал, это было изменение само по себе! Так может кто-нибудь сказать мне, почему это происходит?
PS: gcc версия 4.8.0.
В соответствии с ответом @NPE, и я проверяю адрес size
, и он фактически находится в памяти сразу после a
.
Но когда я добавить кусок кода
printf("%X\n", &size);
перед тем
printf("%d, %X\n", size, &a);
результат
BFC39108
4, BFC3910C
4, BFC3910C
4, BFC3910C
4, BFC3910C
0, 2, 4, 7, 4, 78, 65
в это время, size
находится в памяти непосредственно перед a
.
В самом деле, где бы я печатаю size
's адрес, он расположен прямо перед a
' s адрес; и если я не печатаю адрес size
, он находится сразу после адреса a
. Это все еще неопределенное поведение компилятора?
Я ожидал, что значение размера не должно изменяться. – Jude
Вы больше не можете ожидать, что когда у вас будет неопределенное поведение. – NPE