2011-12-30 2 views
0

Посмотрите на следующую программеНенадлежащее выхода через полукокс указатели

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

Для 1-я пут я получаю правильный выход (т.е.) «ошибка»
Но на 2-й пут я получаю выход как «↓ ошибки (»

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

'' ошибка "' имеет длину 4 символа. Нулевой ограничитель входит в массив. Здесь где-то есть носовые демоны. – nmichaels

+0

@nmichaels Я никогда не слышал о носовых демонах раньше. Спасибо за это, awesome :) – cnicutar

+0

@nmichaels запутался, так как 1st puts смог обнаружить '\ 0' и дал правильный выход. Вот почему этот вопрос поднят – intex0075

ответ

5

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

char p[] = "bug"; 

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

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

+4

Первый работает, потому что 'char * a' идет сразу после' char p [3] 'в стеке. Нулевой ограничитель становится начальным значением для 'a' и до тех пор, пока' a' остается неинициализированным, 'p' заканчивается на ноль. Это не поведение, на которое вы можете положиться. Технически поведение не определено. – nmichaels

+0

как я смог получить правильный вывод для puts? хотя я выделил 3 байта – intex0075

+1

nmichaels прибил его. Вы выделили три байта ** и указатель **. Присвоение 'a' изменило то, что было видно на' p [4] '. –

0

char [4] !!! Не забывайте \ 0 в конце!

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