【发布时间】:2019-05-13 04:16:01
【问题描述】:
char数组是网络消息的一部分,长度明确,不需要空终止符。
struct Cmd {
char cmd[4];
int arg;
}
struct Cmd cmd { "ABCD" , 0 }; // this would be buffer overflow
如何初始化这个 cmd 成员字符数组?不使用strncpy之类的函数?
【问题讨论】:
-
你需要像这样初始化结构变量:- struct Cmd cmd{ {'A','B','C','D'}, 0}; .如果你给“ABCD”,它被认为是字符串文字,并将存储在 const char 指针中,字符串文字以 '\0' 结尾。
-
@sonulohani 不,这不是“需要的”。除了缺少
=之外,给定的初始化很好。 -
@JensGustedt C 默默跳过空终止符的技巧很危险——我认为这是一个语言缺陷。因此,提供
{'A','B','C','D'}初始化程序是一种很好的做法:它是自记录代码,表明程序员意识到缺少空终止,但它也允许编译器/静态分析器在代码的其他地方发出警告,当字符串文字初始值设定项会产生一个不以 null 结尾的字符串。 -
@Lundin “需要”和“良好做法”不是一回事。
-
@JensGustedt 您写道初始化很好。但事实并非如此,因为它包含一个潜在的微妙错误。
标签: c arrays string c11 null-terminated