为了账号安全,请及时绑定邮箱和手机立即绑定

是否可以修改C中的字符串?

是否可以修改C中的字符串?

C
哔哔one 2019-07-04 15:35:31
是否可以修改C中的字符串?几个小时以来,我一直在努力学习各种与指针相关的C教程和书籍,但我真正想知道的是,一旦创建了char指针,是否有可能改变它。这就是我尝试过的:char *a = "This is a string";char *b = "new string";a[2] = b[1]; // Causes a segment fault*b[2] = b[1];  // This almost seems like it would work but the compiler throws an error.那么,是否有任何方法来更改字符串中的值而不是指针地址?谢谢谢谢大家的回答。现在更有意义了。这特别有道理,为什么有时它工作得很好,而另一些时候却不起作用。因为有时我会传递char指针,而其他时候则传递char数组(char数组工作得很好)。
查看完整描述

3 回答

?
慕工程0101907

TA贡献1887条经验 获得超5个赞

当您在源代码中编写“String”时,它将直接写入可执行文件中,因为该值需要在编译时知道(有工具可以将软件分开并找到其中的所有纯文本字符串)。当你写char *a = "This is a string",“这是字符串”的位置在可执行文件中,而指向的位置在可执行文件中。可执行映像中的数据是只读的。

您需要做的(如其他答案所指出的)是在堆上或堆栈帧上的位置创建该内存。如果声明一个本地数组,则在堆栈上为该数组的每个元素创建空格,并将字符串文字(存储在可执行文件中)复制到堆栈中的该空间。

char a[] = "This is a string";

您还可以手动复制数据,方法是在堆上分配一些内存,然后使用strcpy()将字符串文字复制到该空格中。

char *a = malloc(256);strcpy(a, "This is a string");

每当您使用malloc()记得打电话free()当您完成它(读:内存泄漏)。

基本上,您必须跟踪您的数据在哪里。每当您在源中写入字符串时,该字符串都是只读的(否则,您可能会更改可执行文件的行为-想象一下,如果您编写char *a = "hello";然后改变了a[0]'c'..然后在其他地方写printf("hello");..如果允许您更改"hello",而您的编译器只存储了一次(应该是这样),然后printf("hello");会输出cello!)


查看完整回答
反对 回复 2019-07-04
?
繁花如伊

TA贡献2012条经验 获得超12个赞

很多人对char*和char[]之间的区别感到困惑。

char *foo = "hello world";

.实际上是将foo指向一个常量内存块(实际上,编译器在这个实例中对“hello world”所做的操作是依赖于实现的)。

相反,使用char[]告诉编译器您想要创建一个数组并填充它的内容“hello world”。foo是指向char数组的第一个索引的指针。它们都是char指针,但只有char[]将指向本地分配的可变内存块。


查看完整回答
反对 回复 2019-07-04
  • 3 回答
  • 0 关注
  • 950 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信