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-&gt;data=data; 您正在将分配块的起始地址分配给您的指针。也永远不要在" -&gt; " 周围放置空格(错误的形式)如果data 尚未分配,那么您可以为此分配永久存储空间,然后memcpy 我们需要看看您传递的void *data 是如何声明的并且初始化以提供明确的答案。 data_create 的定义在这里会很有帮助 这里没有足够的信息来看看你可能做错了什么。请使用minimal reproducible example 更新您的问题。 @DavidC.Rankin ever put spaces around " -&gt; " (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指针的值分配给结构中的指针[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

给定一个指向内存地址的未知指针访问结构 - C

作业,在 C 中的结构内分配指针

如何将 void* 的引用从 C++/CLI 传递给本机 C 函数

C中void指针的指针算法

C中的结构和指针(将字符串分配给结构)

如何合法地将函数指针转换为方法指针?