Мусорные данные для указателя - PullRequest
0 голосов
/ 28 декабря 2018

В следующем коде я ожидаю напечатать все элементы.Но я получаю некоторое значение мусора после вывода.

[output: 1 3 5 7 9 6356752 15 2 6356884 4198653 1 12586264 12588288 4214784 6356816 -1 6356820 1946143264 1764509639 -2 1946142470 1946142496 12588288 * 1004].

Но если в программе изменить

ar [5] на ar [6]

, то проблема будет решена.Зачем?(Я использую кодовые блоки 17.12)

#include<stdio.h>
int main()
{
    int ar[5]={1,3,5,7,9}, *p;
    p = ar;
    while(*p) printf("%d ",*p++);
    return 0;
}

Ответы [ 2 ]

0 голосов
/ 28 декабря 2018

В C массив с N элементами, инициализированными с P

Таким образом, компилятор инициализирует элементы с P + 1 до N-1 до 0.

0 голосов
/ 28 декабря 2018

С помощью скобочных обозначений все неопределенные значения инициализируются равными 0. Так вот в чем разница.

С int ar[5]={1,3,5,7,9} вы получаете массив, подобный этому (выложенный в памяти):

ar[5] = {  1,    3,    5,    7,    9  }
        +-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
value   |  1  |  3  |  5  |  7  |  9  | ??? | ??? | ??? | ??? | ??? |
        +-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
index   |  0  |  1  |  2  |  3  |  4  | (5) | (6) | (7) | (8) | (9) |
        +-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+

где (5) означает, что ar[5] может получить к нему доступ, но на самом деле он вне границы.

Поскольку вы не знаете, что может быть в ??? блоках, *p является неопределенным(но обычно не ноль), и цикл продолжается, когда он видит ноль в памяти.Это может быть опасно !

С int ar[6]={1,3,5,7,9} вы получите массив, подобный следующему:

ar[6] = {  1,    3,    5,    7,    9        }
        +-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
value   |  1  |  3  |  5  |  7  |  9  |  0  | ??? | ??? | ??? | ??? |
        +-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
index   |  0  |  1  |  2  |  3  |  4  |  5  | (6) | (7) | (8) | (9) |
        +-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+

Поэтому, когда p указывает на ar + 5, *p оценивается как ложное и завершает цикл.

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