Могу ли я инициализировать пустую строку 2D C следующим образом? - PullRequest
0 голосов
/ 19 ноября 2018

Могу ли я инициализировать пустую двумерную строку C следующим образом?

int function(void){
  char s[50][50]={{}};
}

Я не уверен, будет ли строка s инициализирована как пустая, когда она определена в функции, подобной этой.

1 Ответ

0 голосов
/ 19 ноября 2018

Нет, вы не можете, если вы хотите, чтобы ваш код был переносимым C:

% gcc -pedantic-errors -c init.c 
init.c: In function ‘function’:
init.c:2:19: error: ISO C forbids empty initializer braces [-Wpedantic]
   char s[50][50]={{}};
                   ^

Это расширение GCC. Однако вы можете добавить одинарный ноль в фигурных скобках:

char s[50][50] = {{0}};

или даже в пределах одного набора скобок:

char s[50][50] = {0};

он найдет первый скалярный элемент и инициализирует его заданным значением, а остальные элементы, не инициализированные явно, будут инициализированы, как если бы они имели нулевой инициализатор. (Примечание: вы можете использовать, скажем, 42 для одного элемента, а остальные из них будут по-прежнему инициализированы в ноль).

Или, поскольку это массивы char, вы можете использовать строку в фигурных скобках:

char s[50][50] = {""};

Это инициализирует s[0] пустой строкой.


Пустой инициализатор ({ }) GCC необходим для другого расширения - инициализация элементов гибкого массива нулевой длины. Он не существует просто для того, чтобы быть общим сокращением.

Стандартный C не поддерживает инициализацию гибких элементов массива и не поддерживает массивы нулевой длины.

...