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

是否可以修改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数组工作得很好)。


哔哔one
浏览 953回答 3
3回答

慕工程0101907

当您在源代码中编写“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!)

繁花如伊

很多人对char*和char[]之间的区别感到困惑。char *foo = "hello world";.实际上是将foo指向一个常量内存块(实际上,编译器在这个实例中对“hello world”所做的操作是依赖于实现的)。相反,使用char[]告诉编译器您想要创建一个数组并填充它的内容“hello world”。foo是指向char数组的第一个索引的指针。它们都是char指针,但只有char[]将指向本地分配的可变内存块。
打开App,查看更多内容
随时随地看视频慕课网APP