стандартное поведение при инициализации буфера символов - PullRequest
0 голосов
/ 30 октября 2011

Если я определил буфер символов, как показано ниже

char buffer[20] = "foo";

, тогда

buffer[0] == 'f';
buffer[1] == 'o';
buffer[2] == 'o';
buffer[3] == 0;

Что стандарт говорит о буфере [4] до буфер [19] .Они гарантированно будут также обнулены?

Ответы [ 2 ]

8 голосов
/ 30 октября 2011

Все остальные элементы гарантированно будут инициализированы до нуля.

Справка:
C ++ 03 Стандартный раздел 6.7.8, пункт 21:

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

1 голос
/ 30 октября 2011

Многие компиляторы инициализируют содержимое буфера [20] равным 0. Это особенно верно, если вы инициализируете его с помощью {}

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

#include <stdio.h>

int main() {
        char buf1[20] = "foo";
        char buf2[20] = {};
        int i;
        for(i = 0; i < 21; i++ ) {
                printf("%02x ", buf1[i]);
        }
        printf("\n");
        for(i = 0; i < 21; i++ ) {
                printf("%02x ", buf2[i]);
        }
        printf("\n");
}

Обратите внимание, что я поставил 21 в условном выражении, а не 20, просто чтобы выдвинуть вывод за пределы фактического выделения буфера.После этого он должен сбросить мусорный байт.

...