2016-10-10 2 views
-2

Я написал следующую программу: грЛюбопытный массив перезапись

int main() 
{ 
    char a[1]; 
    char b[6]="hello\0"; 
    int c, i; 

    for(i = 0; (c = getchar()) != EOF; i++) 
     a[i] = c; 
    for(i = 0; i < 5; i++) 
     printf("%c", b[i]); 

} 

Почему, когда я подам «до свидания» на входе программы печати «helby»? Я думал, что 'b' должно быть сохранено в [0], 'y' в b [0] и 'e' в b [1]. Благодарим вас за консультацию!

+3

Этот цикл while содержит синтаксис цикла 'for' и не компилируется. Пожалуйста, напишите [Минимальный, Полный и Подтверждаемый пример] (http://stackoverflow.com/help/mcve), который показывает проблему. –

+0

Спасибо, я его отредактировал – sworwitz

+0

ваш результат не воспроизводится :(... проверьте это: https://ideone.com/oAWAiw, здесь мы получаем 'hello' как вывод, когда ввод' bye' – Cherubim

ответ

1

Вы предполагаете, что a сразу же следует за b в памяти. Это не обязательно так.

Чтение/запись за конец массива undefined behavior, поэтому компиляторы могут упорядочить локальные переменные в любом порядке.

На моей конкретной машине, если b будет объявлен до a, то a появляется в памяти как раз перед b и я получаю вывод, который вы ожидаете. Однако, как вы можете видеть из других ответов и комментариев, поведение не является надежным из-за неопределенного поведения.

1

Почему, когда я даю «до свидания» во входной программе, печатайте «helby»?

В программе вы пытаетесь получить доступ за пределы массива a[] в этом цикле:

for(i = 0; (c = getchar()) != EOF; i++) 
    a[i] = c; //only defined behaviour for `i = 0` 

, например, когда вы даете bye в качестве входных данных,

a[0] -> overwritten with b 
a[1] -> undefined behaviour as you are accessing out of bounds 
a[2] -> same as a[1] 

здесь вы можете см., что нигде не изменяется массив b[].

Это приводит к не определено поведение. Таким образом, ваш вывод может быть любым (от ничего общего)

+0

@IlmariKaronen Я удалил первую часть. Надеюсь, теперь ясно! – Cherubim

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