【问题标题】:What does this assignment to a string literal do? [duplicate]这个赋值给字符串文字有什么作用? [复制]
【发布时间】:2021-01-19 15:23:50
【问题描述】:

这是我的代码。我想知道这里发生了什么。谁能描述一下代码?

char *string;  
string = "Le Casa de Papel";      
*(str+1) = 'a';  
return 0; 
 

【问题讨论】:

  • 代码有未定义的行为。:)
  • 没人知道,str 未定义
  • 将角色'a'插入随机内存位置

标签: c char c-strings string-literals pointer-arithmetic


【解决方案1】:

代码 sn-p 具有未定义的行为。

程序员正在尝试使用指针算法将字符串文字 "Le Casa de Papel" 的第二个字符 'e' 替换为字符 'a'

char *string;  
string = "Le Casa de Papel";      
*(str+1) = 'a'; 

注意:我认为有一个错字,最后的陈述应该是

*(string+1) = 'a'; 

可以用其他方式重写以使其更清晰

string[1] = 'a';

但您不能更改字符串文字。任何更改字符串文字的尝试都会导致未定义的行为。

为了使代码有效,您应该用指向字符串文字的指针的声明替换数组声明元素,该数组声明元素由字符串文字初始化,如下面的演示程序所示。

#include <stdio.h>

int main(void) 
{
    char string[] = "Le Casa de Papel";
    
    puts( string );
    
    *(string + 1 ) = 'a'; 

    puts( string );

    return 0;
}

程序输出是

Le Casa de Papel
La Casa de Papel

【讨论】:

  • "你能说出正确的代码是什么,为什么代码有未定义的行为吗?(其中发生了什么?)"
  • @asd 查看我的更新答案。正如我所写,您可能不会更改字符串文字。因此,试图这样做的原始代码是不正确的。
【解决方案2】:

假设str 应该是string,此代码试图将字符串中的第二个字符从e 更改为a,将"Le Casa de Papel" 更改为"La Casa de Papel"。线

*(str+1) = 'a';

相当于写

str[1] = 'a';

这里的问题是"Le Casa de Papel" 是一个字符串文字,尝试修改字符串文字的内容会导致未定义的行为。字符串文字应该是不可变的 - 尝试更改字符串文字的值 应该 就像尝试更改整数常量的值,例如,1 = 2 - 该操作是荒谬的。但是,与整数常量不同,字符串文字必须存储在内存中的某个位置,并且该内存可能是只读的,也可能不是只读的。尝试更改字符串文字可能会导致运行时错误,或者它可能会按预期工作,或者可能发生其他事情 - 语言定义不需要编译器或运行时环境以任何特定方式处理它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-11
    • 2015-10-13
    • 1970-01-01
    • 2013-10-20
    • 2021-01-23
    • 2012-05-24
    • 2020-09-08
    相关资源
    最近更新 更多