C 无效指针,并重新转换为所需类型
我想将in_数组的内存分配为长度为100的双数组,如何以最简单的形式将其作为函数进行分配C 无效指针,并重新转换为所需类型,c,linux,struct,void-pointers,C,Linux,Struct,Void Pointers,我想将in_数组的内存分配为长度为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
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 ;
}
这是否正确?有几个问题: 因为您使用了typedef,所以不需要在数据类型前面添加“struct”:
data_pack*packet=malloc(sizeof(data_pack))代码>
因为您在_数组中声明为void ptr,所以不应该将其转换为double:
(事实上,)
编辑:
作为对注释的响应,如果您想要类型为double的数组,可以将data_pack的声明更改为:
typedef struct{
int message;
double *in_array;
}data_pack;
然后将其视为一个数组:
packet->in_array[0] = 0.1;
packet->in_array[1] = 0.2;
等等;但是,如果希望指针数组加倍,则将in_数组的声明更改为:
typedef struct{
int message;
double **in_array;
}data_pack;
packet->in_array= malloc(100 * sizeof(double *));
而且,由于您现在存储的是指向双精度而不是双精度的指针数组,因此您可以将in_数组的malloc更改为:
typedef struct{
int message;
double **in_array;
}data_pack;
packet->in_array= malloc(100 * sizeof(double *));
然后,您可以向该数组添加指向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));
有几个问题:
因为您使用了typedef,所以不需要在数据类型前面添加“struct”:
data_pack*packet=malloc(sizeof(data_pack))代码>
因为您在_数组中声明为void ptr,所以不应该将其转换为double:
(事实上,)
编辑:
作为对注释的响应,如果您想要类型为double的数组,可以将data_pack的声明更改为:
typedef struct{
int message;
double *in_array;
}data_pack;
然后将其视为一个数组:
packet->in_array[0] = 0.1;
packet->in_array[1] = 0.2;
等等;但是,如果希望指针数组加倍,则将in_数组的声明更改为:
typedef struct{
int message;
double **in_array;
}data_pack;
packet->in_array= malloc(100 * sizeof(double *));
而且,由于您现在存储的是指向双精度而不是双精度的指针数组,因此您可以将in_数组的malloc更改为:
typedef struct{
int message;
double **in_array;
}data_pack;
packet->in_array= malloc(100 * sizeof(double *));
然后,您可以向该数组添加指向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));
如果您希望\u array
中的是一个包含double
的数组,则将其声明为
double *in_array;
并将其分配为
packet->in_array = malloc( sizeof *packet->in_array * 100 );
是的,malloc
返回void*
,但在C中,可以将void*
分配给任何其他对象指针类型(反之亦然),而无需cast1。并且,您正在将结果强制转换为“指向指向double
”的指针,这与您所说的不匹配
这在C++中是不正确的,但是如果你正在编写C++,无论如何你不应该使用<代码> MalOC 。
如果您希望\u array
中的是一个包含double
的数组,则将其声明为
double *in_array;
并将其分配为
packet->in_array = malloc( sizeof *packet->in_array * 100 );
是的,malloc
返回void*
,但在C中,可以将void*
分配给任何其他对象指针类型(反之亦然),而无需cast1。并且,您正在将结果强制转换为“指向指向double
”的指针,这与您所说的不匹配
这在C++中是不正确的,但是如果你正在编写C++,无论如何你不应该使用<代码> MalOC 。
当然,你可以用另一种方法删除typedef,并将in_数组声明为一个ptr来double如果我需要为packet->in_数组分配一个包含100个元素的双数组,我该怎么做呢?非常感谢你,说得很清楚,我有一个数组,比如,double data[100];那么我如何将数据分配给packet->in_array,我们可以像这个packet->in_array=data?我怎样才能从我的结构中提取数据呢?引用:作为澄清,请注意,我说的是“你不施放”,而不是“你不需要施放”。
@Shark ooooo对不起,你完全正确,我错误地引用了你;我会更改它:)当然,你可以用另一种方式删除typedef,并将in_数组声明为ptr to double如果我需要为packet->in_数组分配一个包含100个元素的双数组,我该怎么做呢?非常感谢你,为了澄清这一点,我有一个数组,比如说,double data[100];那么我如何将数据分配给packet->in_array,我们可以像这个packet->in_array=data?我怎样才能从我的结构中提取数据呢?引用:作为澄清,请注意,我说的是“你不施放”,而不是“你不需要施放”。
@Shark ooooo对不起,你完全正确,我错误地引用了你;我来换:)