Можно ли объявить большой массив как статический и использовать его как внешний в других файлах в C - PullRequest
2 голосов
/ 18 марта 2012

У меня очень большой массив, который совместно используется многими функциями во многих файлах в проекте vc.Моя проблема в том, что я должен объявить это в main () и использовать extern в заголовочных файлах.Поскольку массив слишком велик для стека, я должен использовать static, что делает невозможным объявление extern в заголовочных файлах.

Как я могу решить эту проблему?

РЕДАКТИРОВАТЬ:

То, что я сделал, было, как вы сказали, но я получаю ошибка LNK2001: неразрешенный внешний символ

Вот мое глобальное объявление и внешнее объявление:

main.c

static unsigned char bit_table_ [ROWS] [COLUMNS];

hdr.h

extern без знака char bit_table_ [ROWS] [COLUMNS];

ROWS и COLUMNS может вырасти до 1024 и 1048576 соответственно

Ответы [ 2 ]

5 голосов
/ 18 марта 2012

Объявите глобальный указатель и поделитесь им со всеми вашими исходными файлами (через extern в заголовке). Затем заполните этот глобальный указатель в main().

Edit:

Ваши комментарии к вашему вопросу, кажется, указывают на то, что вы путаете кучу со стеком. Просто сделайте ваш массив глобальным и предоставьте к нему доступ с помощью объявления extern в заголовке. Проблема решена, и никаких забавных трюков не возникает.

3 голосов
/ 18 марта 2012

Делая это static, вы избегаете переполнения стека (куча не задействована), но, помещая его в main, никакие другие части вашей программы не могут получить к нему прямой доступ.

Для совместного использования функций и файлов в одной и той же программе вы должны определить ее вне main и поместить для нее объявление extern в заголовок, который вы включите в другие файлы, к которым требуется доступ:

big_array.c:

#include "big_array.h"

int my_big_array[big_size];

в big_array.h:

 #define big_size 1234567

 extern int my_big_array[];

Тогда любой другой файл, которому нужен доступ, просто:

#include "big_array.h"

// ...
my_big_array[1234] = new_value;
...