簡體   English   中英

為什么初始化函數返回null?

[英]Why is my initialization function returning null?

我是第一次用C語言編寫程序。 我在C ++方面有豐富的經驗,但是C對指針的依賴以及缺少newdelete的確使我失望。 我定義了一個簡單的數據結構,並編寫了一個將其初始化的函數(通過獲取指針)。 這是我的代碼:

//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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM