1

cでグローバル構造体を動的に割り当てようとしていますが、何かが原因でcファイルがextern変数への参照を見つけることができません。

ログ:

main.c:18: undefined reference to `gate_array'

extern.h

#ifndef EXTERN_H_
#define EXTERN_H_


typedef struct gate_struct {
    int out;
} gate;

extern gate *gate_array;


#endif /* EXTERN_H_ */

main.c:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include "extern.h"

int main(int argc, char *argv[]){

    gate_array = (gate*) malloc (2* sizeof(gate));

    return 0;
} 

ありがとう!

4

3 に答える 3

3

gate_arraydue toの定義はありませんextern。この場合、extern修飾子を削除するだけです。ただし、extern.hが複数の翻訳単位 (#include複数の.cファイル) で使用された場合、この方法では複数の定義エラーが発生します。の定義 (および将来の変数)を含む別の.cファイルを追加して、 の定義が 1 つだけであることを確認してください。gate_arraygate_array

は、というextern gate *gate_array変数があることをコンパイラに伝えますがgate_array、それは別の場所で定義されています。gate_arrayしかし、投稿されたコードには の定義はありません。


また、 malloc の結果をキャストしますか? も参照してください。

于 2012-05-30T10:53:21.980 に答える
1

これはおそらくあなたが意図したことです:

#ifndef EXTERN_H_
#define EXTERN_H_


typedef struct gate_struct {
    int out;
} gate;

typedef gate *gate_array;


#endif /* EXTERN_H_ */

これtypedefs gate *gate_array。次に、あなたmain.cがしたいこと:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include "extern.h"

int main(int argc, char *argv[]){

    gate_array name_of_array = malloc (2* sizeof(gate));
    free(name_of_array);

    return 0;
} 

以前は、変数名がありませんでした。さらに、return をキャストするのは悪い習慣ですmalloc

于 2012-05-30T10:55:59.037 に答える
0

ゲートへのポインタ iegate_arrayは typedef が宣言されていないため、次のようなことをしていました。

typedef int *IXX;
IXX = (int*) malloc(2*sizeof(int));

次のようにします。

IXX ix = (int*) malloc(2*sizeof(int));
于 2017-07-28T06:00:33.557 に答える