gpt4 book ai didi

C - Malloc 和 memcpy(内存管理)

转载 作者:太空狗 更新时间:2023-10-29 17:08:27 33 4
gpt4 key购买 nike

我对 C 有点陌生,我在理解内存的工作原理方面遇到了困难,尤其是像 memcpy 这样的内置函数。

这是我正在使用的结构

 struct data_t {
int datasize;
void *data;
};

这是我正在使用的辅助功能:

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;
}

现在在 main 函数中我可以毫无问题地这样做:

struct data_t *data = data_create(1024);
data->data="123456a";//just an example

但这会引发段错误:

memcpy(data->data,"123456a",strlen("1234567890a")+1);

我的问题是为什么?我该如何避免呢?请记住我是 C 的新手,所以 C 处理内存的方式对我来说有点陌生

谢谢。

编辑:有效!非常感谢你。完全错过了数据指针。根据 valgrind,现在一切正常。

最佳答案

memcpy(data->data,"123456a",strlen("1234567890a")+1);

失败是因为 data->data 一个 void * 类型指向一些未分配的垃圾/无效地址。 data 具有存储在 readonly 部分 中的字符串文字的地址(如在可执行文件的 .rodata 中并加载到内存中,这是不可写的。此外,如果您没有将这样的字符串地址分配给指针变量,那么它将包含一些无效/垃圾地址值,这些地址值未分配或未使用某些有效的允许位置进行初始化。因此首先分配缓冲区。

data->data = malloc (sizeof (char) * size);

malloc 将返回至少 size * sizeof (char) 字节的地址 block 的首地址。现在您可以将 size 字节复制到 data->data 指向的内存位置。

当您使用 free (addr) 调用完成对内存块的处理后,请记住释放分配的内存块。


我看到你试图以一种非常奇怪的方式分配 data 缓冲区(?):

struct data_t *dt=malloc(sizeof(struct data_t)+size);

额外分配的 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;

先免费做:

free (dt->data);

然后

free (dt);

关于C - Malloc 和 memcpy(内存管理),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7698441/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com