[英]Initialization function (i.e. “constructor”) for struct, why are variables not being initialized properly?
我有一个名为“ FooStruct”的未命名结构,我为此编写了一个函数,该函数初始化其所有变量,并负责动态内存分配。
我尝试运行此代码,但未产生预期的结果。 由于某些原因,变量在函数内部时已正确初始化,但是一旦退出该块,它们便会再次更改。
我正在处理的项目要求仅使用未命名的结构。 为什么会这样呢?
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int fooPrimitive;
} FooStruct;
void FooStructInit(FooStruct * ptr, int num) {
ptr = (FooStruct*)malloc(sizeof(FooStruct));
ptr -> fooPrimitive = num;
// Expected output: 5
// Actual output: 5
printf("ptr -> fooPrimitive: %d\n", (ptr -> fooPrimitive));
}
int main() {
FooStruct * ptr;
FooStructInit(ptr, 5);
// Expected output: 5
// Actual output: some random number
printf("FooStruct -> fooPrimitive: %d\n", (ptr -> fooPrimitive));
}
当将ptr
传递给FooStructInit
,它将被复制,然后为该副本分配malloc
的返回值。 这称为传递值 。 而是传递指向ptr
的指针以实际写入ptr
,而不仅仅是传递的参数:
void FooStructInit(FooStruct** ptr, int num) {
*ptr = malloc(sizeof(FooStruct));
(*ptr)->fooPrimitive = num;
// Expected output: 5
// Actual output: 5
printf("(*ptr)->fooPrimitive: %d\n", ((*ptr)->fooPrimitive));
}
int main() {
FooStruct* ptr;
FooStructInit(&ptr, 5);
// Expected output: 5
// Actual output: 5
printf("FooStruct->fooPrimitive: %d\n", (ptr->fooPrimitive));
}
笔记:
malloc
之后调用free
malloc
的结果 C仅具有按值传递语义,因此,当您将指针传递给函数时,指针的原始值不会更改,而只会在函数中更改本地副本。
解决此问题的方法是将一个指针传递给一个指针,以便您可以更改原始存储位置的值。
void FooStructInit(FooStruct **ptr, int num) {
*ptr = malloc(sizeof(FooStruct));
...
}
int main(void) {
FooStruct * ptr;
FooStructInit(&ptr, 5); /* get the address of the pointer */
...
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.