C语言中的结构赋值
在卷积函数之后,传递相关结构的args指针,然后我需要将其分配给另一个同类结构。按照下面给出的方式分配是正确的还是需要初始化实际参数的内存C语言中的结构赋值,c,struct,C,Struct,在卷积函数之后,传递相关结构的args指针,然后我需要将其分配给另一个同类结构。按照下面给出的方式分配是正确的还是需要初始化实际参数的内存 typedef struct { int batchSize; int filters; int chan; int inSize; int kSize; int stride; float *padded_inp; float *kernal; float *conv_out;
typedef struct
{
int batchSize;
int filters;
int chan;
int inSize;
int kSize;
int stride;
float *padded_inp;
float *kernal;
float *conv_out;
int convPad;
int b; // IMAGE NUMBER
} compute_convFWD;
void *convolution(void *args)
{
compute_convFWD *actual_args = args; // is this a correct assignment ?
...
}
void*
指针会自动转换为其他指针类型(函数指针除外),如果调用方没有这样做,您只需初始化内存。void*
指针会自动转换为其他指针类型(函数指针除外),您只需初始化内存,如果调用方没有这样做。要复制结构,您应该(或者)
或:
上面有一颗樱桃,有人会叫它。。。嗯,说得不太漂亮
compute_convFWD convolute(const void *args) {
compute_convFWD conv = *(const compute_convFWD *)args;
return conv;
}
编辑:当然,也存在其他可能性,但这些是最简单的可能性。要复制结构,您应该(或者) 或: 上面有一颗樱桃,有人会叫它。。。嗯,说得不太漂亮
compute_convFWD convolute(const void *args) {
compute_convFWD conv = *(const compute_convFWD *)args;
return conv;
}
编辑:当然,也存在其他可能性,但这些是最直接的可能性
传递了相关结构的args指针,然后我需要
将其分配给另一个同类结构。指定为是正确的吗
下面给出了,还是需要初始化内存以进行实际操作
阿格斯
是的,这是正确的。但你的问题有些不清楚
如果您正在传递void*
,并且打算对该指针进行操作,则无需通过malloc()
任何缓冲区进行分配,只需像您那样强制转换或分配void*
,并对实际参数
指针执行函数操作
如果您不想更改原始的void*
指针,则应将函数签名更改为:
void *convolution(const void *args)
然后您需要为*args
的副本分配内存(这可能在函数卷积的堆栈上,也可能在堆上。这取决于结构的大小和您的函数需求。(您可以复制*args
的一部分,这同样取决于卷积逻辑!)
用于在函数卷积的堆栈上分配:
compute_convFWD actual_args = *((compute_convFWD*)args); // this initializing can be done with memset also
要在堆上进行分配,请执行以下操作:
compute_convFWD* p_actual_args = (compute_convFWD*)malloc(sizeof(*(compute_convFWD*)args));
*p_actual_args = *((compute_convFWD*)args); // this initializing can be done with memset also
同样,如果您处理的是原始结构的几个数据成员,那么您可以只为正在处理的数据成员大小进行分配(在这种情况下,不需要复制所有结构成员)
传递了相关结构的args指针,然后我需要
将其分配给另一个同类结构。将其分配为是否正确
下面给出了,还是需要初始化内存以进行实际操作
阿格斯
是的,这是正确的。但你的问题有些不清楚
如果您正在传递void*
,并且打算对该指针进行操作,则无需通过malloc()
任何缓冲区进行分配,只需像您那样强制转换或分配void*
,并对实际参数
指针执行函数操作
如果您不想更改原始的void*
指针,则应将函数签名更改为:
void *convolution(const void *args)
然后您需要为*args
的副本分配内存(这可能在函数卷积的堆栈上,也可能在堆上。这取决于结构的大小和您的函数需求。(您可以复制*args
的一部分,这同样取决于卷积逻辑!)
用于在函数卷积的堆栈上分配:
compute_convFWD actual_args = *((compute_convFWD*)args); // this initializing can be done with memset also
要在堆上进行分配,请执行以下操作:
compute_convFWD* p_actual_args = (compute_convFWD*)malloc(sizeof(*(compute_convFWD*)args));
*p_actual_args = *((compute_convFWD*)args); // this initializing can be done with memset also
同样,如果您处理的是原始结构的几个数据成员,那么您可以只为正在处理的数据成员大小进行分配(在这种情况下不需要复制所有结构成员),因此在分配void指针之前,需要按如下方式分配内存。compute_convFWD*actual_args=malloc(sizeof(*actual_args));
No,因为调用者应该已经分配了所需的内存。因此,在分配空指针之前,需要按如下方式分配内存。compute_convFWD*actual_args=malloc(sizeof(*actual_args))
否,因为调用方应该已经分配了所需的内存。您的目标是什么?是否要复制结构?实际参数
与传递的void*
指针的值相同。它指向同一个对象。如果尝试初始化内存,将销毁数据。是否只需要一个指向cal的方便指针ler的结构?您是否需要自己的结构副本?该副本是否必须在卷积
返回后保留,还是只是暂时的?您的目标是什么?是否要复制该结构?实际参数
与传递的void*
指针的值相同。它指向同一个对象。如果尝试初始化您将销毁数据的内存。您是否只需要一个指向调用方结构的方便指针?您是否需要自己的结构副本?该副本是否必须在卷积
返回后保留?还是只是临时的?