инициализация строки нулевым завершением во избежание установки memset - PullRequest
3 голосов
/ 10 февраля 2020

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

#include<stdio.h>

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

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

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

Ответы [ 2 ]

3 голосов
/ 10 февраля 2020

По стандарту C (инициализация 6.7.9)

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

и

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

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

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

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

0 голосов
/ 10 февраля 2020

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

void foo()
{
    char c[64];
    c[0] = 0;
    /* ... */
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...