2014-12-01 2 views
-1

Я новичок в C, поэтому прошу прощения, если вопрос тривиален, но не нашел ответа в сети. Когда я сделать что-то вроде:Почему в C при инициализации массивов ведра внутри массивов имеют случайные значения

int main(void) 
{ 
    int numbers[10]; 

    for(int i = 0; i < 10; i++) 
    { 
     printf("index: %d; value: %d\n", i, numbers[i]); 
    } 

    return 0; 
} 

Он печатает случайные числа, как 0, 1, 1114563524, -1075553756 и т.д. Почему это происходит?

ответ

4

Это потому, что в C, когда вы выделяете память стека, он не очищается для вас. Эти числа, которые вы видите, представляют собой содержимое 4 байтов по адресу памяти в последний раз, когда они были установлены.

Если вы хотите получить память, которая была очищена и установлена ​​на определенное значение, вам необходимо использовать memset в объявленном вами стеке. (См. Комментарий ниже).

Если вы хотите сделать это одним ключевым словом, вы можете использовать calloc для выделения памяти в куче и очистить ее в одной команде. Это то, где явное управление памятью входит в C, поэтому, как только вы вызываете calloc, вам также необходимо вызвать free() в свою память.

+0

Благодарим за ясность – Root149

+0

@ Root149 Это неправильное изображение. Это не имеет никакого отношения к куче или стеку. Значения просто не инициализированы. Можно использовать, например, Элемент element: 'и' memset (& element, 0, sizeof (Element)) 'или' Element * element = malloc (sizeof (Element)); 'и' memset (element, 0, sizeof (Element)) ' – displayname

+0

See например http://stackoverflow.com/questions/8029584/why-does-malloc-initialize-the-values-to-0-in-gcc – displayname

0

Вы должны инициализировать элементы массива, если вы хотите иметь не неопределенные значения:

int numbers[10] = {0}; 

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

+0

OP хотел причину! –

0

По соображениям производительности на языке C неявно освобождается память. Единственным исключением являются переменные статической продолжительности хранения (i. & Thinsp; e. Переменные, объявленные static или extern), которые получают значение 0 (или эквивалентное нулевое значение) при запуске программы неявно, если явно не инициализировать.

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