写入时SIGSEGV分段错误,但不读取?

时间:2016-11-28 18:59:27

标签: c++ pointers segmentation-fault

我有一个名称空间ECFS内联函数,我有以下内容:

inline void changeData(char* data, uint32_t len) {
    for (; len != 0; --len, --curpos) {
        std::cout << data[len] << std::endl;
        data[len] = 'C';
    }
}

读取工作绝对正常,但写入会导致段错误。我已经分配了数据,并确保len不会超出范围,我不知道发生了什么。

编辑:我用来调用它的行是:

char* str = new char[13];
str = "Hello world!";
ECFS::changeData(str, 12); // SIGSEGV

2 个答案:

答案 0 :(得分:2)

char* str = new char[13];
str = "Hello world!";
ECFS::changeData(str, 12); // SIGSEGV

您分配13个字节并在str中存储指向它们的指针。然后你扔掉那个指针并改变str指向一个常数。然后你尝试修改str指向的内容,这是一个常量。你无法修改常量。

你想:

char* str = new char[13];
strcpy(str, "Hello world!");
ECFS::changeData(str, 12);

答案 1 :(得分:0)

使用代码

char* str = new char[13];
str = "Hello world!";
  

只是假设会写入数组。

这不是这里发生的事情。在

str = "Hello world!";

您正在使str指针指向只读数据(通常在程序集中设为.rodata)。任何写入只读数据的尝试都会导致分段错误或SIGSEGV