修改char*类型字符串字面量的代码是否属于未定义行为?
这段C代码是否属于未定义行为?
先把你的代码贴出来方便分析:
#include <stdio.h> void modify(char **s){ char *new_name = "Australia"; *s = new_name; } int main(){ char *name = "New Holland"; modify(&name); printf("%s\n", name); return 0; }
咱们来一步步拆解,看看有没有未定义行为:
- 首先要明确:C语言里字符串字面量(比如
"New Holland")是存储在只读内存区域的,标准规定它的类型是const char[]。虽然出于历史兼容性,允许把它赋值给非const的char*,但如果尝试修改字符串字面量的内容,那才会触发未定义行为——但这段代码里完全没做这种操作。 - 再看
modify函数的操作:我们传入的是name的地址(也就是指向char*的指针),函数里只是把*s(也就是main里的name指针变量)的指向改成了另一个字符串字面量"Australia"。这本质上是修改指针变量本身的值,而不是修改任何字符串的内容,完全符合C标准的规定。 - 最后
printf打印name指向的字符串,此时name指向的是合法的字符串字面量,打印操作也没有任何问题。
结论:这段代码不存在未定义行为,运行后会正常输出Australia。
内容的提问来源于stack exchange,提问作者Sai
相关产品推荐
相关产品推荐

