问题描述
||
我想将一个char复制到给定char *指向的地址。
它在main调用的函数中:
char data = \" \";
myfunction(data,somethingelse);
...
在功能内部我有类似的东西
void myfunction(char* data,short somethingelse) {
...
char byte = 0;
inputfilestream.read(&byte,1);
*data = byte; // here i get the segfault
data++;
...
}
当我使用strncpy复制到副本时,段错误也会出现:
strncpy(data,byte,1);
为什么会有段错误? data不是常量,我实际写入的地址与我分配数据数组的地址完全相同。我已经多次测试了。
提前致谢。
解决方法
字符串文字是只读的。如果您想使用可修改的字符串,则必须使用一个数组,例如:
char data[10];
要么:
char *data = new char[10];
详细说明一下:字符串文字的类型实际上是const char*
。因此,将字符串文字分配给非常量char*
在技术上是无效的,但是大多数编译器出于遗留原因仍允许这样做。当您尝试这样做时,许多现代编译器至少会发出警告。
, data
被分配了字符串文字。字符串文字仅准备就绪,对其进行写入将导致段错误。
尝试这个:
char data[10]; // or whatever size you want.
代替。
,
为什么会有段错误? data不是常量,我实际写入的地址与我分配数据数组的地址完全相同。
您什么都没分配。 char *data = \" \";
甚至不应该在C ++中编译。您正在将常量字符串分配给非常量。
, char byte = 0;
inputfilestream.read(&byte,1);
*data = byte; // here i get the segfault
data++; // << How many times?
没问题
#include <stdio.h>
int main(int argc,char **argv)
{
char *data = \"Yello\"; // or char data[] = \"Yello\";
*data = \'H\';
puts(data); // Hello
}