C 从函数内部调用函数时,程序崩溃
因此,如果我调用array\u printary,程序基本上运行良好;从main。但是当我调用array_printary时;从edit.c程序崩溃 数组.cC 从函数内部调用函数时,程序崩溃,c,struct,C,Struct,因此,如果我调用array\u printary,程序基本上运行良好;从main。但是当我调用array_printary时;从edit.c程序崩溃 数组.c struct array* array_create() { struct array* array = (struct array*) malloc(sizeof(struct array)); array->data = (int*) malloc(sizeof(int) * 10000); array-
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]);
}
编辑.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中意味着什么?数组何时变为空?什么叫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);
}
在我看来,假设main.c中定义的数组与edit.c中定义的数组相同是错误的 如果看不到edit.c中的include,就无法判断。但是main.c中定义的数组似乎是该编译单元的本地数组 很可能edit.c中有一个不同的数组具有相同的“全局”名称 最简单的解决方案是避免在全局数组上运行函数。确保函数“edit”接受和结构数组指针,并处理给定的数组。 在数组上工作的每个函数都应该接受指向该结构的指针。永远不要尝试在神奇数组上工作 如果您确实必须有一个每个人都可以使用的全局数组,那么您可以在头文件中将其定义为“extern array”。 然后每个edit.c文件将使用main.c中初始化的相同数组,但是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。使用NULL初始化它,然后对array_print的调用将该NULL传递给print,这显然会崩溃
选项1:不使用全局变量:
在其头文件中:void editARRAY数组
在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。使用全局变量:
在main.c和edit.c都包含的头文件中:
extern ARRAY my_global_array;
总而言之
ARRAY my_global_array = array_create();
edit();
在edit.c中
void edit() {
array_print(my_global_array);
}
数组似乎未在编辑中定义或声明。它是全局的吗?数组是在调用edit之前创建的吗?谁调用edit?我看到一个叫排序的电话。你能初始化数组吗?数组=NULL;。然后在array_print中验证数组是否已初始化??如果在两个单独的编译单元中声明具有程序作用域的同一变量,这是未定义的行为。嗯,我看到了您的编辑。编辑函数参数必须为空。我可以私下与您联系吗?我想向您展示一些代码,但不想将其公开。我无法解释这个问题,我必须展示它。我可以尝试创建一个聊天室。。一分钟,这个链接我必须有20个代表才能在聊天室聊天,你能过来吗?
void edit() {
array_print(my_global_array);
}