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

时间:2014-02-09 19:50:10

标签: c struct

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

1 个答案:

答案 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);
}