PTd*_*ude 7 c malloc struct memcpy
我对C有点新,我无法理解内存是如何工作的,尤其是内置函数memcpy.
这是struct我正在使用的
struct data_t {
int datasize;
void *data;
};
Run Code Online (Sandbox Code Playgroud)
这是我正在使用的辅助功能:
struct data_t *data_create(int size)
{
struct data_t *dt=malloc(sizeof(struct data_t)+size);
dt->datasize=size;
dt->data="1234567890a";
return dt;
}
Run Code Online (Sandbox Code Playgroud)
现在在main函数中我没有问题这样做:
struct data_t *data = data_create(1024);
data->data="123456a";//just an example
Run Code Online (Sandbox Code Playgroud)
但是这引发了一个Seg Fault:
memcpy(data->data,"123456a",strlen("1234567890a")+1);
Run Code Online (Sandbox Code Playgroud)
我的问题是为什么?我该如何避免呢?请记住我是C的新手,所以C处理内存对我来说有点新鲜
谢谢.
编辑:它的作品!非常感谢你.完全错过了数据指针.根据valgrind的说法,现在一切正常.
memcpy(data->data,"123456a",strlen("1234567890a")+1);
失败,因为data->data一个void *类型指向未分配的一些垃圾/地址无效.data具有存储在readonly部分中的字符串文字的地址(就像在.rodata可执行文件中并加载到内存中,这是不可写的.另外,如果你没有将这样的字符串地址分配给指针变量,那么它将保留一些无效/垃圾地址值,该值未使用某个有效的允许位置进行分配或初始化.因此,首先分配缓冲区.
data->data = malloc (sizeof (char) * size);
Run Code Online (Sandbox Code Playgroud)
该malloc会返回ATLEAST的地址块的第一个位置的地址size * sizeof (char)字节.现在您可以将size字节复制到指向的内存位置data->data.
当你使用该free (addr)调用完成内存块时,请记住释放已分配的内存块.
我看到你试图以data一种非常奇怪的方式分配缓冲区(?):
struct data_t *dt=malloc(sizeof(struct data_t)+size);
Run Code Online (Sandbox Code Playgroud)
额外分配的size字节以及struct data_t.但无论如何,data组件仍然指向一些无法改变的地方.请用:
struct data_t *dt = malloc(sizeof(struct data_t));
dt->data = malloc (sizeof (char) * size);
memcpy (data->data, "whatever", sizeof ("whatever")+1);
return dt;
Run Code Online (Sandbox Code Playgroud)
先免费做:
free (dt->data);
Run Code Online (Sandbox Code Playgroud)
然后
free (dt);
Run Code Online (Sandbox Code Playgroud)