如何解决这个对字符串文字的赋值有什么作用?
这是我的代码。我想知道这里发生了什么。有人能描述一下代码吗?
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 举报,一经查实,本站将立刻删除。