我有一个名称空间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
答案 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
。