因此,如果我从主调用array_print(array);
,基本上程序运行正常。但是当我从 edit.c 调用array_print(array);
时程序崩溃了!
array.c
struct array* array_create()
{
struct array* array = (struct array*) malloc(sizeof(struct array));
array->data = (int*) malloc(sizeof(int) * 10000);
array->size = 10000;
return array;
}
void array_print(ARRAY array)
{
int i;
for (i = 0; i < array->size; i++)
printf("%d ", array->data[i]);
}
array.h
struct array {
int* data;
int size;
};
typedef struct array* ARRAY;
ARRAY array_create();
void array_print(ARRAY array);
edit.c
ARRAY array; // Which array is which?! I have one array in main too...
void edit()
{
array_print(array);
}
的main.c
ARRAY array;
array = array_create();
edit(); // This makes the program crash
修改 这在edit.c中意味着什么?数组何时变为NULL?什么是在edit.c中调用代码,什么都没有?!:
ARRAY array = NULL; // When is this being called and why? I don't want to reset it, I want to work with the array in main...
void edit()
{
array_print(array);
}
答案 0 :(得分:0)
在我看来,假设main.c中定义的Array array
与edit.c中的array
相同是错误的。
如果没有看到edit.c中的包含,就无法分辨。但是main.c中定义的Array似乎是该编译单元的本地。
您可能在edit.c中有一个具有相同“全局”名称的不同数组。
最简单的解决方案是避免在全局数组上运行的函数。确保函数'edit'接受并结构化数组指针并处理给定的数组。 在Array上运行的每个函数都应该接受一个指向结构的指针,永远不要尝试在魔术数组上工作。
如果你真的必须有一个单独的全局数组,那么你就可以在头文件中将它定义为'extern ARRAY'。 然后每个edit.c文件将使用在main.c中初始化的相同ARRAY但是edit.c只能在一个通常非常无意义的数组上工作
修改
您编辑的代码:
ARRAY array = NULL; // When is this being called and why? I don't want to reset it, I want to work with the array in main...
void edit() {
array_print(array);
}
edit.c中的基本上说:我有一个名为array的新ARRAY指针。用NULL初始化然后对array_print的调用传递了要打印的NULL,这显然会崩溃。
选项1:不使用Globals:
在其标题文件中:void edit(ARRAY array)
在edit.c文件中:
void edit(ARRAY array) {
array_print(array);
}
最后在main.c中调用它时
ARRAY my_main_array = NULL;
my_main_array = array_create();
edit(my_main_array );
选项2.使用Globals:
在一个头文件中,main.c和edit.c都包括:
extern ARRAY my_global_array;
在main.c中
ARRAY my_global_array = array_create();
edit();
在edit.c中
void edit() {
array_print(my_global_array);
}