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

为何可输出结构体中字符串字面量的转换字符?与不可修改理论存疑

为什么访问字符串字面量的字符并转大写不会触发问题?

我写了如下C语言代码:

typedef struct node
{
    char *name;
}
node;

int main(void)
{
    node *temp = malloc(sizeof(node));
    node *table[2];

    table[0] = temp;
    table[0]->name = "tamesh";
    
    printf("%c \n",  toupper(table[0]->name[0]));
}

运行后成功输出"T"。但我知道字符串字面量是不可修改的,这和我的认知有冲突,想请教原因。


你完全没违反字符串字面量不可修改的规则,因为你根本没尝试修改它:

  • 你的代码只是读取了字符串字面量"tamesh"的第一个字符t,把这个字符的数值传给toupper函数。
  • toupper函数是接收字符值后,返回对应的大写字符的数值,整个过程没有对原字符串字面量的内存做任何写入操作。

字符串字面量不可修改的限制,指的是不能直接修改它的内存内容,比如写table[0]->name[0] = 'T';这种代码——这才会触发未定义行为(可能程序崩溃、可能出现异常结果)。而你的代码只是读取字符值来做转换输出,完全合法,和这个规则没有冲突。

内容的提问来源于stack exchange,提问作者Lexicon Builder

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 21:20:43