微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

这个对字符串文字的赋值有什么作用?

如何解决这个对字符串文字的赋值有什么作用?

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

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

解决方法

代码片段有未定义的行为。

程序员正在尝试使用指针算法将字符串文字 "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
,

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

*(str+1) = 'a';

相当于写作

str[1] = 'a';

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。