Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 无效指针,并重新转换为所需类型_C_Linux_Struct_Void Pointers - Fatal编程技术网

C 无效指针,并重新转换为所需类型

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

我想将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_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对不起,你完全正确,我错误地引用了你;我来换:)