2016-02-01 5 views
0

Я создаю объект struct в своем коде, и я хочу уничтожить этот объект. Я знаю, для создания указателей я должен использовать malloc() для выделения и free() для освобождения указателя или массива. Но у меня вопрос о объекте struct. Я искал ответы здесь, и я нашел решение использовать скобки {} - размещение объекта struct в скобках, поэтому вне объекта struct struct right bracket будет освобожден. Но мне интересно освободить объект в глобальном массиве. Как я могу освободить такой объект? Пример кодаРазвертывание структуры в функции внешней C

typedef struct { 
    unsigned char m_some_property; 
} my_struct; 


static my_struct g_myStructArr[10]; 


int main(void) 
{ 
    g_myStructArr[0].m_some_property = 20; 
    // how to use brackets {} here to deallocate that object? 
    return 0; 
} 

Возможно ли это?

+0

Для освобождения 'g_myStructArr []', вызовите 'выхода (-1);', но, конечно, крайности. – chux

ответ

3

Вы не можете, глобальные переменные будут выделены на время жизни программы. Также я не понимаю, почему вы хотите, вы не должны беспокоиться об этом, так как использование глобальных переменных очень редко необходимо. Глобальные переменные выделяются, когда программа запускается и освобождается, когда она заканчивается.

+0

Спасибо, у меня есть массив в моей программе, и я заполняю элементы этого массива объектами структуры. В настоящее время у меня этот массив статический (не динамический). Я хочу уничтожить элементы этого массива, когда они мне не нужны. У меня странная идея: использовать free() и передать адрес элемента n, но я думаю, что это не сработает: free (g_myStructArr + 2); – shx

+0

Почему вы хотите их уничтожить? Уничтожение часто означает повторное использование пространства, поэтому просто сделайте это. Добавьте поле в структуру, чтобы определить, занят ли он. Или используйте 'malloc()', но я не хочу, чтобы вы делали это с помощью 'malloc()'. –

+0

Да, это статический массив, и malloc не следует использовать здесь. Я хочу динамически добавлять/заполнять элементы этого массива и динамически удалять элементы. Я должен реализовать стек. У меня недостаточно памяти в программе, и я вынужден освободить каждую ненужную переменную/объект в своей программе. – shx

-1

Исполняемый программы C делится на следующие разделы:

сегмент текста:

Машинный код двоичного считывается в этом разделе. Текстовый сегмент часто является сегментом только для чтения, чтобы предотвратить его изменение.

Сегмент Initialized данных:

Все глобальные, статические, постоянные и внешние переменные, которые инициализируются записываются в этот раздел.

Сегмент Uninitialized данных:

Этот раздел содержит все неинициализированный глобальные и статические данные и инициализируется до нуля, прежде чем программа начнет выполняться.

Heap:

Почти все динамические распределения памяти приходят из этого раздела.

Stack:

Этот сегмент начинается с очень высокого адреса и растет downwords, как функции называются. Фреймы функций, локальные переменные, обратные адреса и т. Д. Получают память из этого сегмента. Как указал Элиас, этот стек сильно отличается от структуры данных стека. Это сегмент памяти, где есть стиль в организации данных. Единственная распространенная вещь в них заключается в том, что они динамически растут в LIFO.

Coming на ваш вопрос, вам нужно объявить указатель в глобальном пространстве, как

my_struct *foo; 

и в основной(), вы можете выделить необходимую память динамически и сделать этот указатель, чтобы указать на эту память

foo = calloc(10, sizeof (my_struct)); 

и когда вам нужно освободить память, вы можете использовать realloc() для изменения размера.

malloc(), calloc() не работают в глобальном сегменте данных. Библиотека malloc запускает большой кусок памяти, расширяя точку прерывания при инициализации и распределяя динамические распределения памяти, используя malloc() и др. в этой области памяти.

A typical memory layout of a C program.

+2

. * некоторые * реализации, а также не имеют отношения к вопросу. Я запрограммировал встроенные системы, у которых не было кучи, текстового сегмента, сегмента данных и переменных стека (не все сразу!) –