簡體   English   中英

初始化結構而不定義結構成員-C

[英]Initialize structures without defining members of structure - C

我試圖破譯某人的代碼,我看到了一些我不理解的東西。 我沒有看到關於沒有在標頭或代碼開頭定義成員但以后再定義成員時如何應用結構的任何引用。這是我嘗試弄清楚的示例。 我注意到Data_t *數據; 在我們輸入funky函數並且我的編譯器在此行上出錯之前,標題中沒有定義。 我想我的問題是 - 這是將數據輸入結構的有效方法嗎?

非常感謝!

#include <stdio.h>

typedef struct config{
    int a;
    int b;
    int c;
    Data_t *data;
} config_t;

int funky(config_t *config);

int main( void )
{
    printf("In main()\n");
    config_t config;
    funky(&config);

    printf("a = %d\n", config.a);   //accessing config's a member

    return 0;
}

int funky(config_t *config)
{
    printf("In funky()\n");

    Data_t *dataa = config->data;
    for(i=0;i<5;i++){
        dataa[i].mem1=i;
        dataa[i].mem2=4+i;
    }

    //Set values
    config->a = 1;
    printf("a = %d\n", config->a);  //pointer to config's a member

    return 0;
}

Data_t的定義沒有出現在您的代碼中,這是導致編譯錯誤的原因。

另外 - 對於您的特定問題,該代碼是取消引用未初始化的指針,這會導致未定義的行為。 mainconfig結構中初始化data字段,否則您將遇到麻煩。 這段代碼:

Data_t *dataa = config->data;
for(i=0;i<5;i++){
    dataa[i].mem1=i;
    dataa[i].mem2=4+i;
}

是不好的東西 - 正如你所看到的,它將單位化指針復制出來並嘗試通過它訪問內存。

之后的代碼:

//Set values
config->a = 1;

很好,是一種初始化結構的完全合理的方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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