Реализация целочисленного указателя массива в переполнении стека

int a[5]={1,2,3,5,6};
int *apnt= a;
while (*apnt)
{
printf("The no is %d\n",*apnt);
apnt++;
}

В отличие от строк, я знаю, что в конце массива нет нулевого элемента. Однако мой код всегда выдает следующий вывод, независимо от того, сколько раз я очищаю память или перезапускаю xcode. Что здесь происходит? Кто-нибудь может дать мне понимание?

Выход:

The no is 1
The no is 2
The no is 3
The no is 5
The no is 6
The no is 32767
The no is 144723190
The no is 1694538263
The no is 1606416704
The no is 32767
The no is -1982110263
The no is 32767

-5

Решение

Чтение за концом массива неопределенное поведение. То, что вы видите, даже если вы видите что-либо, не предсказуемо правилами языка C ++.

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

1

Другие решения

Я думаю, что другие ответчики ошибаются в намерении вашего вопроса — я предполагаю, что вы не пытаетесь найти неопределенное поведение в C ++, просто пытаетесь перебрать свой массив. Проблема в вашем коде в том, что вы продолжаете увеличивать указатель apnt за концом массива Это неопределенное поведение, и все может случиться.

Тем не менее, обычно, что происходит в этом случае, вы будете продолжать читать память, которая после a массив (другие локальные переменные в вашей функции). Это объясняет, почему «искаженный» вывод является предсказуемым. Вместо этого вам следует перебирать только количество элементов в массиве (например, с помощью цикла for), ИЛИ вы можете добавить «0» в конец массива, чтобы цикл while завершился.

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector