我已经编写了几个C程序,并认为这个问题很难解决。但是为什么我会收到以下代码的分段错误?#34; test" by" aaaa"?
#include <stdio.h>
int main(int argc, char* argv[])
{
char* s = "test\0";
printf("old: %s \n", s);
int x = 0;
while(s[x] != 0)
{
s[x++] = 'a'; // segmentation fault here
}
printf("new: %s \n", s); // expecting aaaa
return 0;
}
答案 0 :(得分:10)
此赋值是写入字符串文字,当它在内存中加载时,存储在可执行文件的只读部分。
另请注意,文字中的\0
是多余的。
解决此问题的一种方法(如注释中所示)而不复制字符串:将变量声明为数组:
char s[] = "test";
这将导致函数为堆栈上的字符串分配至少5个字节的空间,这通常是可写内存。
此外,您通常应该将指向字符串文字的指针声明为const char*
。这会导致编译器在尝试写入时抱怨,这很好,因为系统加载器通常会将它指向的内存标记为只读。
答案 1 :(得分:0)
在发布到@antron的评论中回答了OP的问题。
您需要的是分配一个字符数组,然后使用strcpy()
用文本初始化它,然后用a
- s覆盖。
分配可以静态完成(即char s[10];
),但要确保空间足以存储初始化字符串的长度(包括终止\0
)。
或者,您可以使用malloc()
动态分配内存并使用free()
释放内存。这使您可以分配足够的空间来保存init字符串(使用strlen()
在运行时计算出来。)