You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 14:42:31