写入时出现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 中断))