Почему инициализация массива с 0 очищает весь буфер? - PullRequest
0 голосов
/ 08 апреля 2019

Я инициализирую свой массив с 0, и у меня чистый буфер, что происходит с битами? Например, когда я инициализирую с 'a', не то же самое, если бы это было с memset, весь буфер был бы заполнен 'a'?

#include <stdio.h>
#include <string.h>

int main(void) {

    char buffer[256] = {0}, array[256] = {'a'};
    char array1[256];
    memset(array1, 'a', sizeof(array1));

    printf("%c\n%c\n%c\n", buffer[1], array[1], array1[1]);

    return 0;

}

Ответы [ 3 ]

2 голосов
/ 08 апреля 2019

Инициализация в случае array[256] = {'a'}; происходит согласно этому правилу:

6.7.9 Инициализация
...
21 Если в списке, заключенном в фигурные скобки, меньше инициализаторов, чем элементов или членов агрегата или меньше символов в строковом литерале, используемом для инициализации массива известного размера, чем элементов в массиве, остальная часть агрегата должна быть инициализирована неявно так же, как объекты, которые имеют статическую длительность хранения .

Так что только первый элемент array будет иметь значение 'a'.

Но в случае функции memset,

void *memset(void *s, int c, size_t n);

функция копирует значение c(преобразуется в unsigned char) в каждый из первых n символов объекта, на который указывает s.

Таким образом, в этом случае все элементы array1 будут иметь значение 'a'.

2 голосов
/ 08 апреля 2019

Если инициализатор не предоставляет достаточно элементов для инициализации полной переменной, остальная часть инициализируется так, как если бы переменная была объявлена ​​глобально, то есть:

  • целых до 0
  • плавает до 0.
  • указателей на NULL.

В вашем конкретном примере остальные элементы char -array array будут следовать вышеупомянутому правилудля целых чисел.

0 голосов
/ 08 апреля 2019

Когда вы входите в функцию, в этом случае main() стек увеличивается на величину, необходимую для фрейма стека, в фрейме стека есть место для всех auto (переменных, объявленных внутри функции), а также для других информация здесь не актуальна. Так что в этом случае, когда вы пишете

char array[256]

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

Когда вы пишете

char array[256] = {'a'}

это эквивалентно:

char array[256];
array[0] = 'a';

В этом случае мы не определили, что находится в остальной части массива

Когда вы делаете

memset(array, 'a', sizeof(array))

ЦП должен будет пройти через весь массив и инициализировать каждый символ в массиве в «a», создавая известное значение для всего в массиве за счет использования немного больше ЦП.

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