C语言中的结构赋值

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;

在卷积函数之后,传递相关结构的args指针,然后我需要将其分配给另一个同类结构。按照下面给出的方式分配是正确的还是需要初始化实际参数的内存

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*
指针的值相同。它指向同一个对象。如果尝试初始化您将销毁数据的内存。您是否只需要一个指向调用方结构的方便指针?您是否需要自己的结构副本?该副本是否必须在
卷积
返回后保留?还是只是临时的?