我正在尝试动态分配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;
}
谢谢!
答案 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));