【发布时间】:2020-12-03 07:18:07
【问题描述】:
以下示例代码;
char* g_commands[]={
"abcd",
NULL
};
int main()
{
g_commands[1] = "efg";
char ** tmp = &g_commands[0];
for(; *tmp != NULL; tmp++){
printf("%s", *tmp);
}
return 0;
}
由于 tmp 在循环中指向 g_commands 数组中的指针,在我将“efg”分配给 g_commands[1] 之后,我预计循环会创建分段错误,因为 g_commands 的最后一个元素不再为空。但程序无异常结束,打印abcdefg成功。
为什么会这样?编译器是否也将 NULL 添加到 char* 数组的末尾?
【问题讨论】:
-
不,它没有。在这种情况下,你碰巧走运了。这是未定义的行为。
-
您注意到在您的环境中碰巧允许“abcdefg”的未定义行为,但不会跨平台发生。什么是未定义的行为?这基本上意味着您正在做的事情超出了 C 标准,因此不同的编译器实现可能会以不同的方式处理它。它不是由 C 本身定义的。
标签: arrays c pointers char-pointer