инициализация строки нулевым завершением во избежание установки memset

Я написал этот код:

#include<stdio.h>

int main(void)
{
    char c[10]="";                //Q

    if(c[2]=='')
        printf("hello");
    return 0;
}

В строке //Q установлена ​​ли вся строка в '' или просто в 0-й индекс? Хотя при проверке вывода он печатает привет, но я не уверен, является ли его какое-то значение ошибочным или умышленным?

Всего 2 ответа


Из стандарта C (6.7.9 Инициализация)

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

и

  1. ... Если объект, который имеет статическое или потоковое время хранения, не инициализируется явно, то:

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

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

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


если вы хотите установить только один символ в ноль (в вашем случае первый), вам нужно присвоить ноль этому символу.

void foo()
{
    char c[64];
    c[0] = 0;
    /* ... */
}

Есть идеи?

10000