当您在源代码中编写"字符串"时,它会直接写入到可执行文件中,因为需要在编译时知道该值(有一些工具可用于拆分软件并查找其中的所有纯文本字符串).当您编写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
!)