[英]Why is my initialization function returning null?
我是第一次用C语言编写程序。 我在C ++方面有丰富的经验,但是C对指针的依赖以及缺少new
和delete
的确使我失望。 我定义了一个简单的数据结构,并编写了一个将其初始化的函数(通过获取指针)。 这是我的代码:
//in Foo.h
#include <stdio.h>
#include <stdlib.h>
typedef struct Foo {
struct Foo * members[25] ;
} Foo ;
void foo_init(Foo * f) ;
void foo_destroy(Foo * f) ;
//in Foo.c
void foo_init(Foo * f) {
f = (Foo*)malloc(sizeof(Foo));
for (size_t i = 0 ; i < 25 ; i++) {
f->members[i] = NULL ;
}
}
//define foo_destroy()
//in main.c
#include "Foo.h"
int main(int argc, const char * argv[])
{
Foo * f ;
foo_init(f) ;
/* why is f still NULL here? */
foo_destroy(f) ;
/* ... */
return 0;
}
当我在f
(指向Foo
结构的指针foo_init()
上测试foo_init()
函数时,该函数返回后为null。 指针f
内 foo_init()
初始化就好了,但是,我不认为这是与初始化函数本身就是一个问题。 在黑暗中拍摄,但这可能与C处理值传递/引用传递的方式有关(我仍然不完全了解这一点)? 我该如何纠正?
1)您超出了for循环的范围(如@ user3121023所指出,更改为25
)
2)您正在(m)为局部变量分配空间,请使用:
Foo *foo_init(void) {
Foo *f = malloc(sizeof(Foo)); /* don't cast malloc */
for (size_t i = 0 ; i < 25 ; i++) {
f->members[i] = NULL ;
}
return f;
}
并且main
:
f = foo_init();
void foo_init(Foo* f)
在C中,参数按值传递。 在这里,您传递一个名为f
的参数,类型为Foo*
。 在函数中,您分配给f
。 但是由于参数是通过值传递的,因此您将分配给该函数专用的本地副本。
为了使调用者能够看到新分配的结构,您需要额外的间接级别:
void foo_init(Foo** f)
{
*f = ...;
}
在呼叫站点:
Foo* f;
foo_init(&f);
现在,由于您的函数旨在将新值发送给调用方,并且您的函数当前具有void
返回值,因此将新值返回给调用方会更有意义。 像这样:
Foo* foo_init(void)
{
Foo* foo = ...;
return foo;
}
您可以这样称呼:
Foo* f = foo_init();
在函数void foo_init(Foo * f)
您正在传递一个指针。 现在,此指针作为该函数中的值传递,并且对该函数内部对该变量的修改不会反映在该函数外部。 换句话说,函数foo_init中的变量f是局部变量。
因此,您应该通过执行以下操作来返回f的值:
Foo* foo_init(Foo * f)
{
f = (Foo*)malloc(sizeof(Foo));
for (size_t i = 0 ; i < 25 ; i++) {
f->members[i] = NULL ;
}
return f;
}
除了此注释之外,我还更改了for循环中的条件。 您分配了25个对象的数组。 因此,您的for循环应从0到24。
基本上你应该
f = foo_init();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.