【问题标题】:Assigning character to char[x] results in segmentation fault将字符分配给 char[x] 会导致分段错误
【发布时间】:2015-08-06 10:05:06
【问题描述】:

我已经编写了几个 C 程序,并且认为这很难问。但是为什么我会收到以下代码的分段错误,该代码应该将“test”替换为“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;
}

【问题讨论】:

    标签: c arrays char segmentation-fault


    【解决方案1】:

    这个赋值正在写入一个字符串文字,当它被加载到内存中时,它存储在可执行文件的只读部分中。

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

    在不复制字符串的情况下解决此问题的一种方法(如 cmets 中所建议的):将变量声明为数组:

    char s[] = "test";
    

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

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

    【讨论】:

    • 谢谢。是的,只有阅读确实可以正常工作。你知道如何解决这个问题吗?我的意思是以一种我不必手动计算文字的字符串长度的方式进行修复。
    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多