【问题标题】:Pointer in Struct in C - How to assign the value of a given void pointer to a pointer in a struct [closed]C中结构中的指针-如何将给定的void指针的值分配给结构中的指针[关闭]
【发布时间】: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 页面以了解该网站的工作原理,然后再开始发布,您会发现您在这里的体验会好很多。

标签: c pointers memory struct


【解决方案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 我不知道这和我的评论有什么关系?
猜你喜欢
  • 1970-01-01
  • 2018-05-16
  • 1970-01-01
  • 2013-03-04
  • 2018-04-08
  • 2014-05-13
  • 2016-03-21
  • 2023-04-06
  • 2017-09-01
相关资源
最近更新 更多