2014-02-09 3 views
0

Так что в основном программа работает нормально, если я позвоню array_print(array);с основного номера. Но когда я звоню array_print(array); с edit.c программа вылетает!Программа вылетает при вызове функции изнутри функции

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 Что это значит в 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); 
} 
+2

'array', кажется, не будет определено ни объявлена ​​в' edit'. Это глобально? – Kninnug

+0

- массив, созданный до того, как вызывается edit()? – fritzone

+0

Кто звонит? Я вижу вызов sort_perform. Можете ли вы инициализировать массив? 'ARRAY array = NULL;'. Затем в array_print убедитесь, что массив был инициализирован? – odedsh

ответ

0

Мне кажется, что вы неправильно считать, что Array array определено в main.c такое же, как array в edit.c

Не видя включений в edit.c, невозможно сказать. Но массив, определенный в main.c, кажется локальным для этого модуля компиляции.

Вероятно, у вас есть другой массив в edit.c с тем же глобальным именем.

Ваше самое простое решение - избежать функций, которые работают с глобальными массивами. Убедитесь, что функция «edit» принимает и структурирует указатель массива и работает над массивом, который он дал. Каждая функция, которая работает в массиве, должна принимать указатель на структуру, никогда не пытающуюся работать с магическим массивом.

Если вы действительно ДОЛЖНЫ иметь один глобальный массив, над которым каждый работает, вы определяете его в файле заголовка как «extern ARRAY». Затем каждый файл edit.c будет использовать тот же массив, который был инициализирован в main.c, но тогда edit.c будет работать только на одном массиве, который на самом деле, как правило, довольно бессмысленно

EDIT

код вы редактировали:

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 для печати, который, очевидно, сбой.

ВАРИАНТ 1: Не Использование Глобалы: В своем заголовочном файле: 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); 

Option 2. Использование глобалов:

В файле заголовка, который как main.c, так и edit.с включают в себя:

extern ARRAY my_global_array; 

В main.c

ARRAY my_global_array = array_create(); 
edit(); 

В edit.c

void edit() { 
    array_print(my_global_array); 
} 
+0

Хм, я вижу твою правку. Параметры параметров edit() должны быть ничем. – user3285214

+0

Затем посмотрите на вариант 2 .. – odedsh

+0

Могу ли я связаться с вами в частном порядке? Я хочу показать вам код, но не хочу делиться им с публикой. Я не могу объяснить проблему, я должен показать ее. – user3285214

Смежные вопросы