Зачем нам нужно инициализировать массив 0 (ноль)? - PullRequest
1 голос
/ 21 июня 2011

Я обнаружил, что в языке Си, но я не знаю другого языка, нужно инициализировать массив 0 или нет.

for (i = 0; i < MAXSIZE; i++)  {
    a[i] = 0;
}

Есть ли причина для этого?

В каких случаях мне нужно инициализировать массив равным 0, а в каких - нет?

Ответы [ 5 ]

2 голосов
/ 21 июня 2011

Причина, по которой вы делаете это, состоит в том, что массив будет содержать значения мусора (значения, ранее сохраненные в этой ячейке памяти). Обнуление - это хорошая практика, потому что ноль - это значение, которое при неправильном использовании вызывает проблемы, которые легко найти и отладить (разыменование NULL и т. Д.). С другой стороны, значения мусора могут создать у вас впечатление, что ваша программа работает только для того, чтобы вывести ее из строя в какой-то несвязанной части кода, поскольку неправильное использование значения мусора затерло какую-то другую область памяти.

2 голосов
/ 21 июня 2011

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

2 голосов
/ 21 июня 2011

Если вы собираетесь использовать значения из массива сразу после его создания, вы хотите, чтобы эти значения имели что-то.В отсутствие дополнительной информации 0 является хорошим начальным значением.

Если вы собираетесь использовать массив только для хранения значений (в начале), и вам все равно, что в нем,не инициализироватьВы сохраняете шанс внести ошибку (и несколько наносекунд от времени выполнения).

#include <stdio.h>
int main(void) {
    int arr[256];
    int ch;

    for (int k=0; k<256; k++) arr[k] = 0; /* initialized because we're going
                                           ** to use the values */
    while ((ch = getchar()) != EOF) {
        arr[(unsigned char)ch] += 1;        /* use the previous 0 */
    }
}

или

#include <stdio.h>
int main(void) {
    int arr[256];      /* not initialized */
    for (k = 0; k < 256; k++) {
        arr[k] = getchar(); /* initialization from file */
    }
}
2 голосов
/ 21 июня 2011

Чтобы получить ответ на каждый язык, вам просто нужно посмотреть документацию по этим языкам.

т. http://php.net/manual/en/language.types.array.php

http://docs.python.org/library/array.html

http://cvs.haskell.org/Hugs/pages/libraries/base/Data-Array.html

Исторически мы инициализировали массив в 0, чтобы предотвратить попадание в массив неверных данных (остатков другого использования памяти).

0 голосов
/ 21 июня 2011

C99 имеет это сказать об инициализации в Разделе 6.7.8, подпункт 10:

Если объект, у которого есть автоматическая продолжительность хранения, не инициализируется явно,его значение неопределенно.Если объект со статической продолжительностью хранения не инициализирован явно, то:

, если он имеет тип указателя, он инициализируется нулевым указателем;

если он имеет арифметический тип, он инициализируется равным (положительному или без знака) нулю;

если это агрегат, каждый член инициализируется (рекурсивно) в соответствии с этими правилами;

если это объединение, первый именованный элемент инициализируется (рекурсивно) в соответствии с этими правилами.

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