[英]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.