【问题标题】:void pointer, and re casting to required typevoid 指针,并重新转换为所需的类型
【发布时间】:2020-11-18 22:34:18
【问题描述】:

我想将 in_array 的内存分配为长度为 100 的双精度数组,我该如何以最简单的形式将其作为函数。

typedef struct{
int message;
void*in_array;
}data_pack;

我试图这样为 100 个元素的双数组分配内存

struct data_pack* createpack()
{
struct data_pack* packet = (struct data_pack*)malloc(sizeof(struct data_pack));
packet->in_array= (double **)malloc(100 * sizeof(double));

return packet ;
}

这对吗?

【问题讨论】:

    标签: c linux struct void-pointers


    【解决方案1】:

    有几个问题:

    因为你使用了typedef,所以你不需要在你的数据类型前面加上'struct':

    data_pack* packet = malloc(sizeof(data_pack));

    并且因为您已将 in_array 声明为 void ptr,所以不应将其强制转换为 double

    packet->in_array= malloc(100 * sizeof(double));
    

    (其实是don't cast the result of malloc to anything..

    编辑:

    针对评论,如果您想要一个 double 类型的数组,您可以将 data_pack 的声明更改为:

    typedef struct{
    int message;
    double *in_array;
    }data_pack;
    

    然后把它当作一个数组:

    packet->in_array[0] = 0.1;
    packet->in_array[1] = 0.2;
    

    等等;但是如果你想要一个指向 double 的指针数组,那么你将 in_array 的声明更改为:

    typedef struct{
    int message;
    double **in_array;
    }data_pack;
    

    而且,由于您现在存储的是 指向双精度的指针数组而不是双精度,因此您将 in_array 的 malloc 更改为:

    packet->in_array= malloc(100 * sizeof(double *));
    

    然后,您可以将指向双精度的指针添加到该数组,例如:

    double foo = 0.1;
    packet->in_array[0] = &foo;
    

    编辑 2

    要将一个数组的内容复制到另一个数组,请使用 memcpy

    #include <string.h>
    
    double foo[100] = {0.1,0.2};
    memcpy( packet->in_array, foo, sizeof(foo));
    

    它是双向的:

    double foo[100] = {};
    memcpy( foo, packet->in_array, sizeof(foo));
    

    【讨论】:

    • 当然,你也可以反其道而行之,去掉typedef,将in_array声明为一个ptr来加倍
    • 如果我需要将一个包含 100 个元素的双精度数组分配给 packet->in_array,我该怎么做
    • 非常感谢,为了说明这一点,我有一个数组说,double data[100];那么我如何将数据分配给数据包-> in_array,我们可以像这样的数据包-> in_array = data; ?以及如何从我的结构中取出数据?
    • 咳嗽 咳嗽 引用:As a clarification, note that I said "you don't cast", not "you don't need to cast".
    • @Shark oooo 抱歉,您完全正确,我引用错误了;我会改变它:)
    【解决方案2】:

    如果您希望in_array 成为double 的数组,则将其声明为

    double *in_array;
    

    并将其分配为

    packet->in_array = malloc( sizeof *packet->in_array * 100 );
    

    是的,malloc 返回 void *,但在 C 中,void * 可以分配给任何其他对象指针类型(反之亦然),而不需要强制转换1。而且,您将结果转换为“指向double 的指针”,这与您所说的不匹配。


    1. 这在 C++ 中不是正确的,但是如果你正在编写 C++,那么无论如何你都不应该使用malloc

    【讨论】:

      猜你喜欢
      • 2021-09-20
      • 2015-02-14
      • 1970-01-01
      • 2017-10-07
      • 2015-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多