将字符分配给char [x]会导致分段错误

时间:2015-05-25 00:03:09

标签: c arrays char segmentation-fault

我已经编写了几个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;
}

2 个答案:

答案 0 :(得分:10)

此赋值是写入字符串文字,当它在内存中加载时,存储在可执行文件的只读部分。

另请注意,文字中的\0是多余的。

解决此问题的一种方法(如注释中所示)而不复制字符串:将变量声明为数组:

char s[] = "test";

这将导致函数为堆栈上的字符串分配至少5个字节的空间,这通常是可写内存。

此外,您通常应该将指向字符串文字的指针声明为const char*。这会导致编译器在尝试写入时抱怨,这很好,因为系统加载器通常会将它指向的内存标记为只读。

答案 1 :(得分:0)

在发布到@antron的评论中回答了OP的问题。

您需要的是分配一个字符数组,然后使用strcpy()用文本初始化它,然后用a - s覆盖。

分配可以静态完成(即char s[10];),但要确保空间足以存储初始化字符串的长度(包括终止\0)。

或者,您可以使用malloc()动态分配内存并使用free()释放内存。这使您可以分配足够的空间来保存init字符串(使用strlen()在运行时计算出来。)