Неправильный вывод через указатели на символы - PullRequest
0 голосов
/ 31 декабря 2011

Посмотрите на следующую программу

int main()
{
 char p[3]="bug";
 puts(p);
 char *a=p;
 puts(a);
 return 0;
}

Для 1-го пута я получаю правильный вывод (т. Е. "Ошибка"
Но для 2-го пута я получаю вывод в виде "ошибки ↓ ("

  1. Почему для второго выходного значения мусора добавляется в конце?
  2. char * a указывает на то же место в памяти, что и char p [3]. Почему он не может обнаружить конец'\ 0'?

Ответы [ 2 ]

5 голосов
/ 31 декабря 2011

Для хранения "bug" + терминатор 0 вам нужно 4 символа , вы только выделите 3. Попробуйте:

char p[] = "bug";

Я подозреваю, что первый puts работаетпотому что компилятор делает что-то смешное и может определить размер.

nmichaels имеет лучшее объяснение: Первый работает, потому что char *a идет сразу после char p [3] в стеке.Терминатор null становится начальным значением для a и до тех пор, пока остается неинициализированным, p заканчивается на ноль.

0 голосов
/ 31 декабря 2011

символ [4] !!! Не забудьте \ 0 в конце!

...