Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 从函数内部调用函数时,程序崩溃_C_Struct - Fatal编程技术网

C 从函数内部调用函数时,程序崩溃

C 从函数内部调用函数时,程序崩溃,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-

因此,如果我调用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->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);
}