У меня проблема в том, что массив, объявленный в стеке как автоматическая переменная, перезаписывает массив, объявленный статически. Я не могу процитировать точный код как по причине размера, так и по интеллектуальной собственности, но набросок следующий.
У меня есть следующая структура:
struct mystruct_type {
const int list_size;
const int* list;
};
У меня есть глобальный статический массив этих структур:
struct mystruct_type mystruct_ar[] = {
{3, (int[]){1, 2, 3}},
{2, (int[]){1, 3}},
{5, (int[]){4, 2, 3, 4, 5}}
};
Этот массив находится в исходном файле, который скомпилирован в библиотеку.
У меня есть другой исходный файл, который скомпилирован в другую библиотеку с автоматическим массивом:
void my_func(void)
{
char my_string[1000];
// etc...
}
Когда все это связано вместе, я вижу, что адрес один из list
s в mystruct_ar
перекрывается с my_string
, и когда я копирую что-то в my_string
, он переопределяет элементы в этом list
, вызывая множество проблем.
Мое понимание того, как работают компилятор и компоновщик, заключается в том, что статический массив и все его подмассивы принадлежат одной области памяти, а стек (для которого объявлено my_string
) находится в отдельной неперекрывающейся области , Что может быть причиной этого совпадения? Что я могу проверить?
Я использую GCC 4.3.2 в SuSE10 Linux (x86-64_linux26). Все связано статически.
РЕДАКТИРОВАТЬ: несколько комментариев ниже сказал, что это не компилируется. Они правы. В процессе очистки моего фрагмента для презентации я не стал приводить массив list
к int[]
. Это исправлено выше.