Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 初始化字符数组和MISRA错误_C_Arrays_Array Initialization_Misra - Fatal编程技术网

C 初始化字符数组和MISRA错误

C 初始化字符数组和MISRA错误,c,arrays,array-initialization,misra,C,Arrays,Array Initialization,Misra,我有以下几行(简化为最低限度地说明问题): 该行生成以下MISRA错误: Error[Pm023]: missing elements - braces shall be used to indicate and match the structure in the non-zero initialization of arrays and structures (MISRA C 2004 rule 9.2). 为什么这是一个错误 我目前的解决办法是: char version_text[64

我有以下几行(简化为最低限度地说明问题):

该行生成以下MISRA错误:

Error[Pm023]: missing elements - braces shall be used to indicate and match the structure in the non-zero initialization of arrays and structures (MISRA C 2004 rule 9.2).
为什么这是一个错误

我目前的解决办法是:

char version_text[64U] = {0};
这表明我的编译器(IAR EW)将
char
类型实现为
signed char


我的理解是“\0”是一个字符文本,因此,应该与C中的类型
char

匹配,整数字符常量的类型是
int
,而不是
char
。所以

char version_text[64U] = { '\0' };

是完全等价的(这与
char
的符号性无关)。两者都提供一个
int
常量作为唯一的初始化器

MISRA检查者抱怨第一个,而不是第二个,这只是一种不一致

然而,这可能是因为零初始化通常只提供一个
0
,而使用整数字符常量通常只用于非零初始化-如果我正确解释消息,MISRA希望所有元素都使用初始化器,而检查器只是不查看字符常量内部。

规则说:

“还要注意,数组或结构的所有元素都可以 通过提供显式初始化器初始化(零或空) 仅第一个元素。如果选择此初始化方法 然后,第一个元素应初始化为零(或NULL),并且 无需使用嵌套大括号。”


根据这一点,只有
{0}
{NULL}
符合MISRA,而{'\0'}不符合MISRA(即使编译器以相同的方式处理它们)。

尝试以下操作:

char version_text[64U] = { '\0', };
这实际上会将每个数组元素初始化为
NULL
,而不仅仅是第一个数组元素。 注意一个逗号

或者在本例中为“
,这也是符合要求的。
char version_text[64U] = { 0 };
char version_text[64U] = { '\0', };