gpt4 book ai didi

c - 是否可以在C中修改一串char?

转载 作者:太空狗 更新时间:2023-10-29 16:16:51 25 4
gpt4 key购买 nike

我已经在各种与指针相关的 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 *a = "This is a string"时,"This is a string"的位置在可执行文件中,a指向的位置,是在可执行文件中。可执行镜像中的数据是只读的。

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

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 !)

关于c - 是否可以在C中修改一串char?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1011455/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com