C extern struct指针动态分配

时间:2012-05-30 10:50:27

标签: c struct malloc extern

我正在尝试动态分配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;
} 

谢谢!

3 个答案:

答案 0 :(得分:3)

gate_array没有extern的定义。在这种情况下,您只需删除extern限定符即可。但是,如果extern.h用于多个翻译单元(#include个文件中的.c),则此方法会导致多个定义错误。考虑添加另一个.c文件,其中包含gate_array的定义(以及任何未来的变量),确保gate_array只有一个定义。

extern gate *gate_array告诉编译器有一个名为gate_array的变量,但它在其他地方被定义。但是在发布的代码中没有gate_array的定义。


另外,您可能希望阅读 Do I cast the result of malloc?

答案 1 :(得分:0)

这可能是你的意思:

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

以前您缺少变量名称。此外,它是bad practice to cast the return of malloc

答案 2 :(得分:0)

指向门的指针,即gate_array是未声明的typedef所以你做的是这样的事情:

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

做这样的事情:

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