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

Posted

技术标签:

【中文标题】写入时出现SIGSEGV分段错误,但不读取?【英文标题】:SIGSEGV segmentation fault when writing, but not reading? 【发布时间】:2016-11-28 18:59:27 【问题描述】:

我有一个命名空间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

【问题讨论】:

告诉我们你是怎么称呼它的。我敢打赌 1,000 美元,您将向它传递一个指向常量的指针。 (你不能修改常量,这就是使它成为常量的原因。) 有帮助:您使用 len 作为索引没有考虑到索引是 0 到数组大小 - 1。调用源说明了这一点,但对于良好的编码实践,它会有所帮助在您的命名/用法中显示它。 @donjuedo 我本来打算将其更改为 while 循环(具有正确的索引:P),但感谢您的提示。 【参考方案1】:
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);

【讨论】:

仍然习惯于指针......只是假设它会写入数组。 :/ 谢谢!【参考方案2】:

有代码

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

只是假设会写入数组。

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

str = "Hello world!";

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

【讨论】:

以上是关于写入时出现SIGSEGV分段错误,但不读取?的主要内容,如果未能解决你的问题,请参考以下文章

分配时出现分段错误[重复]

尝试锁定共享内存互斥体时出现分段错误

在 Python 中使用 multiprocessing.shared_memory.ShareMemory 时出现分段错误(退出代码 139(被信号 11:SIGSEGV 中断))

访问共享进程内存时出现分段错误(核心转储)

exe C时出现分段错误错误

使用共享内存时出现分段错误