Следующий фрагмент кода c, по-видимому, занимает до 8 символов на входе, а затем дает segFault для больших входов.Один байтовый массив символов, как представляется, хранит 8 символов строки ввода
int main()
{
char a[1];
printf("Input:\n");
scanf("%s",a);
printf("%s\n",a);
printf("%d\n",strlen(a));
printf("%d\n",sizeof(a));
return 0;
}
Выходы
Случай 1:
Input:
aaaaaaaa
aaaaaaaa
8
1
Случай 2:
Input:
aaaaaaaaa
aaaaaaaaa
9
1
[1] 15688 segmentation fault (core dumped)
Моя машина представляет собой 64-разрядный Intel Linux
Компилятор gcc version 6.1.1 20160802 (GCC)
Последовательность команд выполняется:
gcc -c -g test.c
- создает выходной файл test.o
gcc -o test test.o
./test
Я новичок в программирования C. Любое понимание очень ценится.
На поверхности я ожидаю, что он выдаст некоторую ошибку или предупреждение при вводе 2 или более символов.
Также objdump -d test
дал sub $0x10,%rsp
, что означает, что в стеке хранится 16 байт для main(). Так что, возможно, в качестве входных данных должно принимать 16 символов, а не 8.
Что вы ожидаете от этого? – Amit
Это неопределенное поведение. Может произойти все, что угодно. В вашем случае вы переопределяете границу основного фрейма. – Ari0nhh
@Amit Я ожидаю segFault для ввода 2 или более символов, поскольку каждый ввод символов должен быть 1 байт в размере – stWrong