C中结构中的指针-如何将给定的void指针的值分配给结构中的指针[关闭]
Posted
技术标签:
【中文标题】C中结构中的指针-如何将给定的void指针的值分配给结构中的指针[关闭]【英文标题】:Pointer in Struct in C - How to assign the value of a given void pointer to a pointer in a struct [closed] 【发布时间】:2021-11-20 22:23:01 【问题描述】:我是 C 新手,我很难弄清楚如何将给定 void 指针的值分配给我在结构中的指针,而不会弄乱内存。运行调试程序后,我看到这个函数没有正确清除内存。它缺少一个 free()。
struct data_t
int datasize;
void *data;
struct data_t *data_create2(int size, void *data)
if(size < 1 || data == NULL)
return NULL;
struct data_t *d = data_create(size); //creates a new element of data_t and reserves the necessary memory
memcpy(d -> data, data, size);
return d;
;
调用此函数后,还有另一个函数 data_destroy 销毁返回的结构,在本例中为 d。
我做错了什么?如果需要更多代码,请询问
【问题讨论】:
d->data=data;
您正在将分配块的起始地址分配给您的指针。也永远不要在" -> "
周围放置空格(错误的形式)如果data
尚未分配,那么您可以为此分配永久存储空间,然后memcpy
我们需要看看您传递的void *data
是如何声明的并且初始化以提供明确的答案。
data_create
的定义在这里会很有帮助
这里没有足够的信息来看看你可能做错了什么。请使用minimal reproducible example 更新您的问题。
@DavidC.Rankin ever put spaces around " -> " (bad form)
我做了 30 年,这是我的首选形式。那么大卫,我是一个糟糕的程序员吗?
本网站的指南要求您在询问与代码相关的问题时提供minimal reproducible example。 MRE 意味着我们可以复制并粘贴到代码编辑器中、编译和运行以重现问题的代码。如果您花一些时间在tour 和阅读help center 页面以了解该网站的工作原理,然后再开始发布,您会发现您在这里的体验会好很多。
【参考方案1】:
我会做一些不同的方式,只有一个动态内存分配(因此也只有一个空闲)
使用适当的尺寸类型。在 C 标准中为此目的定义了size_t
typedef struct
size_t datasize;
unsigned char data[];
mydatatype;
mydatatype *alloc(size_t size)
mydatatype *md = malloc(sizeof(*md) + size);
if(md)
md -> datasize = size;
return md;
mydatatype *data_create2(size_t size, void *data)
mydatatype *result = NULL;
if(size && data)
result = alloc(size);
if(result)
memcpy(result -> data, data, size);
return result;
void data_destroy(mydatatype *md)
free(md);
【讨论】:
啊,在结构中使用 FAM 而不是data
的指针。这很好用,唯一的限制是你永远不能拥有mydatatype
的数组。如果没有这种情况,FAM 是一个很好的解决方案。
@DavidC.Rankin 你可以有指向这个支柱的指针数组。仍然比结构中的指针少分配
指针数组很好,但不允许包含 FAM 或包含具有 FAM 作为另一个结构(或联合)成员的结构的结构数组。 C11 Standard - 6.7.2.1 Structure and union specifiers(p3)
@David 我不知道这和我的评论有什么关系?以上是关于C中结构中的指针-如何将给定的void指针的值分配给结构中的指针[关闭]的主要内容,如果未能解决你的问题,请参考以下文章