几个小时来,我一直在努力学习各种C教程和与指针相关的书籍,但我真正想知道的是,一旦创建了一个char指针,是否有可能更改它.

这就是我try 过的:

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中的指针和数组

我可以动态分配具有空类型函数的矩阵吗?

将 typewriter LF打印到Windows终端,而不是隐含的CR+LF

DPDK-DumpCap不捕获端口上的传入数据包

__VA_OPT__(,)是否可以检测后面没有任何内容的尾随逗号?

为什么C语言允许你使用var =(struct NAME){

用C++实现余弦函数

如何在提取的索引中分配空值?

如何在GET_STRING输入后对少数几个特定字符串进行C判断?

如何在VSCode中创建和使用我自己的C库?

静态初始化顺序失败是否适用于C语言?

隐藏测试用例无法在c程序中计算位数.

生成一个半RNG,结果用C表示(无随机/随机)

发送和接收的消息中的Unix域套接字不匹配

生成的头文件不包括用户定义的文件

Tcl_GetDoubleFromObj在列表的迭代中是一个缺点

%g浮点表示的最大字符串长度是多少?

使用替代日历打印日期

在 C23 之前如何对空指针使用nullptr?

如何确保 gcc + libc 对于多字节字符串使用 UTF-8,对于 wchar_t 使用 UTF-32?