Неожиданный вывод кода C - PullRequest
0 голосов
/ 10 марта 2012

Это мой код c:

#include <stdio.h>


int main(){

int x[] = {6,1,2,3,4,5};
int *p=0;
p =&x[0];


while(*p!='\0'){

    printf("%d",*p);
    p++;
}

return 0;


}

При запуске вывод 612345-448304448336

Какие цифры после знака минус и почему мой код дает это?

Ответы [ 3 ]

2 голосов
/ 10 марта 2012

Условие *p != '\0', которое совпадает с *p != 0, никогда не выполняется, потому что ваш массив не содержит элемента со значением 0, и, таким образом, вы пересекаете границы массива и переходите к undefinedповедение .

Вместо этого вы должны напрямую управлять диапазоном массива:

for (int const * p = x; p != x + sizeof(x)/sizeof(x[0]); ++p)  // or "p != x + 6"
{
    printf("%d", *p);
}
1 голос
/ 10 марта 2012

Вы запускаете цикл, пока не встретите \0, но ваш массив никогда не был \0 завершен.

int x[] = {6,1,2,3,4,5};

создает массив, который не \0 завершается. Вам придется явно добавить \0 в качестве последнего элемента.

Поскольку массив не \0 завершен, циклы while() работают до тех пор, пока не встретится случайный \0. Технически, это неопределенное поведение , потому что вы читаете содержимое памяти, которое не выделено для вашей переменной.

Предлагаемое решение:

int x[] = {6,1,2,3,4,5,0};

while(*p != 0)
0 голосов
/ 10 марта 2012

Массивы в C не имеют нулевого завершения. Вот почему ваш цикл выходит за пределы объявленного массива. Цифры, следующие за 5, - это то, что происходит в этом пространстве памяти. Если бы после выделения массива не было нулевого символа, цикл продолжал бы работать до тех пор, пока не возникнет ошибка SegFault.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...