2016-09-08 11 views
-2

Следующий фрагмент кода 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.

+2

Что вы ожидаете от этого? – Amit

+1

Это неопределенное поведение. Может произойти все, что угодно. В вашем случае вы переопределяете границу основного фрейма. – Ari0nhh

+0

@Amit Я ожидаю segFault для ввода 2 или более символов, поскольку каждый ввод символов должен быть 1 байт в размере – stWrong

ответ

3

Если у вас есть массив, объявленный как:

char a[1]; 

он может содержать только один символ для хорошо ведет себя программу. Если вы помещаете в массив несколько символов, программа подвержена неопределенному поведению. Вы не можете понять, как ведет себя такая программа, когда ее поведение по определению неопределено.

Не делайте этого.
Бессмысленно осознавать поведение такой программы.

+0

следует ли удалить вопрос? – stWrong

+0

Нет, это не обязательно. Это часть изучения языка - создание багги-кода и выяснение, почему он не ведет себя так, как вы ожидаете. –

+0

@stWrong системных автокодов вопросов с отрицательной оценкой и дублированной ссылкой, через полчаса или около того. Не принимайте это лично, это просто означает, что сайт уже имеет эту информацию, чтобы он не повторялся. –

 Смежные вопросы

  • Нет связанных вопросов^_^