2011-01-03 13 views
0

私は誰かのコードを解読しようとしていますが、わかりません。メンバーがヘッダーやコードの冒頭に定義されていないが、後で定義されるときに、構造がどのように適用されるかについての参照はありません。ここでは、私が把握しようとしているものの例を示します。私はData_t *データに注意しました。私たちがファンキーな関数を入力し、この行にコンパイラのエラーが出るまで、ヘッダの中には定義されていません。私は私の質問は - これは構造にデータを入力するための有効な方法だろうと思いますか?構造体のメンバーを定義せずに構造体を初期化する - C

多くの感謝!

#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; 
} 

答えて

2

Data_tの定義は、コンパイルエラーの原因となるコードには表示されません。

また、あなたの特定の質問に対して、そのコードは、未定義の動作を引き起こす初期化されていないポインタを逆参照しています。 フィールドのconfig構造体をmainに初期化するか、問題が発生する可能性があります。このコードブロック: - あなたが見ることができるように、それはコピー初期化されないポインタのうち、それを介してメモリにアクセスしようと

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; 

は罰金であり、構造を初期化するために、完全に合理的な方法:その後

コード。

+0

こんにちはCarlさん、迅速な対応をありがとう。ですから、mainのconfig構造体のデータフィールドを初期化すれば、それは正常でしょうか?私が参照しているコードでは、main()コードでは、config.data = calloc(NUM、sizeof(Data_t))のようなコードを実行しています。コンパイラが実際に定義されていないときのData_tのサイズを知る方法はわかりません。 (?? O_O ??)ありがとう.. –

+0

それはあなたを解決するはずです、はい。 'Data_t'が定義されていないためにコンパイラエラーを修正することはできませんが、それをクリアしていると仮定すると、そのポインタを初期化することも重要です。 –

+0

Data_tの定義についてどう思いますか?あなたがData_tを定義すると、私はそれを見る方法です。つまりtypedef struct dataS {int mem1; int mem2; } Data_tヘッダーまたはメインの場合、Data_t * dataa = config-> dataを実行する必要はありません。ファンキーな機能で。それは以前の疑問の1つに戻る - メンバーを作る必要があるときに、関数内の構造のメンバーを定義することは可能ですか? –

関連する問題