Как очистить структуру c
Перейти к содержимому

Как очистить структуру c

Удаление памяти (структура)

Структура Си. Удаление информации
Как в программе написать НОВУЮ СТРУКТУРУ, чтобы с указаныым возрастом информация исчезла #include.

Структура государства — Удаление со сдвигом влево
Здравствуйте. Вот выполнил структуру на тему государства. Организовал вывод, добавление со сдвигом.

Представление и структура указателя в памяти
Указатель занимает 4 байта памяти. Если судить по определению "указатель — это переменная, которая.

Логическая структура памяти в IBM PC
Пережовывая википедию, в статье про оперативную память наткнулся на следующую структуру: В.

Супер-модератор

Эксперт Pascal/DelphiАвтор FAQ

32793 / 21133 / 8144
Регистрация: 22.10.2011
Сообщений: 36,393
Записей в блоге: 8

А как ты выделял память под эту структуру (или массив структур)? Показывай — будем знать, как освобождать.

«Обнуление» структур и массивов

Ведь по логике инициализации в таком случае должен инициализироватся только первый элемент массива, структуры.
Вот и возникло подозрение, что эта некая примочка то ли винды, то ли компилятора.
Собственно вопрос — гарантирует ли такой способ инициализации обнуление памяти? И соответствует ли он стандартам?

А то по старинке memset или ZeroMemory виндовую для обнуления использую.

22 ответа

27 февраля 2008 года
4.8K / / 20.01.2000

Хотелось бы уточнить очередную мелочь. Соответствует ли стандарту обнуление структуры или массива при объявлении таким вот образом:

struct COOLSTRUCT
int a;
char b;
>;

Ведь по логике инициализации в таком случае должен инициализироватся только первый элемент массива, структуры.
Вот и возникло подозрение, что эта некая примочка то ли винды, то ли компилятора.
Собственно вопрос — гарантирует ли такой способ инициализации обнуление памяти? И соответствует ли он стандартам?

А то по старинке memset или ZeroMemory виндовую для обнуления использую.

А почему бы самому не взять стандарт и не почитать?
Ответ: соответствует.

27 февраля 2008 года
223 / / 03.04.2006

А почему бы самому не взять стандарт и не почитать?
А смысл этого раздела на форуме?;) Я вот к примеру 3 справочника по С/С++ перерыл перед тем как этот вопрос задать. Так что моя совесть чиста 😀

27 февраля 2008 года
2.9K / / 03.08.2007

Хотелось бы уточнить очередную мелочь. Соответствует ли стандарту обнуление структуры или массива при объявлении таким вот образом:

struct COOLSTRUCT
int a;
char b;
>;

Ведь по логике инициализации в таком случае должен инициализироватся только первый элемент массива, структуры.
Вот и возникло подозрение, что эта некая примочка то ли винды, то ли компилятора.
Собственно вопрос — гарантирует ли такой способ инициализации обнуление памяти? И соответствует ли он стандартам?

А то по старинке memset или ZeroMemory виндовую для обнуления использую.

COOLSTRUCT *test= NULL;

27 февраля 2008 года
2.7K / / 02.02.2008
А почему бы самому не взять стандарт и не почитать?
Ответ: соответствует.

К сожалению, нигде не встретил способа, как инициализировать массив из нескольких значений одним числом (типа int iArr[10]=;). И в учебниках не нашёл. Можете указать источник (и желательно страницу), в котором сказано об такой инициализации.

27 февраля 2008 года
223 / / 03.04.2006

[quote=oxotnik333]COOLSTRUCT *test= NULL;[/quote]
Вопрос был по инициализации статически создаваемой структуры.

[quote=Kogrom]К сожалению, нигде не встретил способа, как инициализировать массив из нескольких значений одним числом (типа int iArr[10]=;). И в учебниках не нашёл. [/quote]
Аналогичная ситуация. По идее, такая запись должна инициализировать только первый элемент массива. С какой стати должны обнулятся остальные, не понятно.

27 февраля 2008 года
4.8K / / 20.01.2000

К сожалению, нигде не встретил способа, как инициализировать массив из нескольких значений одним числом (типа int iArr[10]=;). И в учебниках не нашёл. Можете указать источник (и желательно страницу), в котором сказано об такой инициализации.

В первом посте ты говорил об обнулении, а теперь уже об «инициализации одним числом». Аппетит приходит во время еды? 🙂

Источник — стандарт C++.

7 If there are fewer initializers in the list than there are members in the aggregate, then each member not explicitly initialized shall be value-initialized (8.5).
[Example:

initializes ss.a with 1, ss.b with «asdf», and ss.c with the value of an expression of the form int(), that is, 0. ]

Исходя из этого, инициализировать дефолтовыми значениями можно даже так:
int iArr[10] = <>;

27 февраля 2008 года
2.7K / / 02.02.2008

В первом посте ты говорил об обнулении, а теперь уже об «инициализации одним числом». Аппетит приходит во время еды? 🙂

У меня не было такого поста. Автор того поста другой человек. Наверно пора заводить аватарку.

Источник — стандарт C++.

. and ss.c with the value of an expression of the form int(), that is, 0.

Исходя из этого, инициализировать дефолтовыми значениями можно даже так:
int iArr[10] = <>;

Тогда можно вобще не инициализаровать, все равно int по умолчанию будет нулём. И какой смысл в этой инициализации, если можно просто написать
int iArr[10];

27 февраля 2008 года
223 / / 03.04.2006

Да, это был я 🙂
Только не в курсе я, чем отличается обнуление при объявлении от инициализации.

Инициализировать то походу все же нужно, т.к. int нулем делает инициализация значением по умолчанию выражения int(), а не объявление.

struct noInit
int a;
char *b;
> tst;

Объявление всего лишь выделяет память нужного размера.

P.S. Пустой блок <> при инициализации не прокатывает :(.

27 февраля 2008 года
1.1K / / 01.08.2005
Да, это был я 🙂
Только не в курсе я, чем отличается обнуление при объявлении от инициализации.

И я не в курсе. Может тем что для инициализации надо знать чем инициализировать, а для обнуления даже 0 не нужен. XOR по памяти и все. Угадал ?

27 февраля 2008 года
7.3K / / 20.01.2000

И я не в курсе. Может тем что для инициализации надо знать чем инициализировать, а для обнуления даже 0 не нужен. XOR по памяти и все. Угадал ?

На сколько я знаю — есть термин «инициализация» — т.е. гарантированное присвоенное какого либо определенного значения какой либо вновь созданной переменной. «Обнуление» (если конечно такой термин существует 🙂 ) — это гарантированная установка переменной в 0.

28 февраля 2008 года
4.8K / / 20.01.2000

На сколько я знаю — есть термин «инициализация» — т.е. гарантированное присвоенное какого либо определенного значения какой либо вновь созданной переменной.

«Обнуление» (если конечно такой термин существует 🙂 ) — это гарантированная установка переменной в 0.

Такой термин применил кто-то из авторов вопроса.
На самом деле в этом контексте существует 3 термина:
zero-initialize,
default-initialize,
value-initialize
За подробностями следует обратиться к п.8.5 стандарта.

28 февраля 2008 года
2.7K / / 02.02.2008
Цитаты из стандарта

To zero-initialize an object of type T means:

if T is a scalar type (3.9), the object is set to the value 0 (zero), taken as an integral constant expression, converted to T;

if T is an array type, each element is zero-initialized;

Every object of static storage duration shall be zero-initialized at program startup before any other initialization takes place.

То есть, насколько я понял, если ничего не делать, то массив и проинициализируется нулём (zero-initialized). Значит, если просто записать
int iArr[10];
то, согласно стандарту, все элементы массива проинициализируются нулём. А колдовства с фигурными скобками в данном случае не требуется.

28 февраля 2008 года
4.8K / / 20.01.2000

Цитаты из стандарта

То есть, насколько я понял, если ничего не делать, то массив и проинициализируется нулём (zero-initialized). Значит, если просто записать
int iArr[10];
то, согласно стандарту, все элементы массива проинициализируются нулём. А колдовства с фигурными скобками в данном случае не требуется.

А где ты видишь в записи
int iArr[10];
инициализацию?
Инициализация описывается соотв. синтаксисом, см. п.п. 8.5.1 и 8.5.2

28 февраля 2008 года
2.7K / / 02.02.2008

Явно её нет, но меня смущает, то, что в стандарте я не нашел утверждения типа: если требуется произвести инициализацию нулем, следует записать выражение

тип имя_переменной[размер] = <>;

Кроме того, меня смущает выражение:

Every object of static storage duration shall be zero-initialized at program startup before any other initialization takes place.

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

Может это спорный вывод, но подтверждение ему я нашел только в примере

float y[4][3] = <
< 1 >, < 2 >, < 3 >, < 4 >
>;
initializes the first column of y (regarded as a two-dimensional array)
and leaves the rest zero.

Комментарий к примеру я понимаю примерно так: инициализируется первый столбец, все остальные элементы остаются в нуле. Заметьте, ОСТАЮТСЯ, а не устанавливаются в ноль. Хотя, может я неправильно перевожу.

28 февраля 2008 года
4.8K / / 20.01.2000

Так тут вся тонкость в тех словах, которые ты почему-то упустил:
«Every object of static storage duration . «

Читаем пункт 3.7.1 стандарта, и удивляемся коду:

int main()
static int staticArray[20];
int localArray[20];

29 февраля 2008 года
1.1K / / 16.08.2003

int main()
static int staticArray[20];
int localArray[20] = <>;

int iVar;
int iVar2();

Так в чем же разница? Почему в языке сделано именно так? И почему статические объекты изначально забиты нулями? Постигнув принцип, уже не запутаешься.

29 февраля 2008 года
4.8K / / 20.01.2000

int main()
static int staticArray[20];
int localArray[20] = <>;

Хм. это было адресовано мне?

int iVar;
int iVar2();

Так в чем же разница? Почему в языке сделано именно так? И почему статические объекты изначально забиты нулями? Постигнув принцип, уже не запутаешься.

А при чем тут статические объекты?
int iVar; — определение переменной
int iVar2(); — объявление функции

29 февраля 2008 года
1.1K / / 16.08.2003

Хм. это было адресовано мне?

А при чем тут статические объекты?
int iVar; — определение переменной
int iVar2(); — объявление функции

Адресовано не вам.

int iVar;
int iVar2();

это обе пременные типа int, с небольшим отличием, связанным с темой топика

29 февраля 2008 года
4.8K / / 20.01.2000

int iVar;
int iVar2();

это обе пременные типа int, с небольшим отличием, связанным с темой топика

Ошибаешься. 🙂
Читаем «всем известную литературу».

29 февраля 2008 года
1.1K / / 16.08.2003
Ошибаюсь, а может здесь не хватает контекста.
29 февраля 2008 года
4.8K / / 20.01.2000
Ошибаюсь, а может здесь не хватает контекста.

Неа, просто ошибаешься, контекст здесь не при чем.
Смотрим «всем известную литературу»:
[quote=Бьярн Страустрап. Справочное руководство по C++]
8.6 Инициализация

Заметьте, что поскольку () не является инициализатором, то «X a();» является не описанием объекта класса X, а описанием функции, не получающей значений и возвращающей X.
[/quote]
[quote=INTERNATIONAL STANDARD ISO/IEC 14882 Second edition 2003-10-15]
8.5 Initializers

8 [Note: since () is not permitted by the syntax for initializer,

is not the declaration of an object of class X, but the declaration of a function taking no argument and returning an X. The form () is permitted in certain other initialization contexts (5.3.4, 5.2.3, 12.6.2). ]
[/quote]

Наверное, ты имел в виду вот это:

[C] Освободить память занятую структурой.

man getgrgid

RETURN VALUE

.

The return value may point to a static area which is overwritten by a subsequent call to getgrent(), getgrgid(), or getgrnam().

Попробуй юзать getgrgid_r

anonymous
( 16.08.10 13:04:37 MSD )

А как у вас выглядит getgrgid? И да, разве не надо до free(gr) сделать free(gr->gr_name) и т.д.?

Eddy_Em ☆☆☆☆☆
( 16.08.10 13:04:45 MSD )

Ты ее не выделил

Boy_from_Jungle ★★★★
( 16.08.10 13:06:23 MSD )
Ответ на: комментарий от Boy_from_Jungle 16.08.10 13:06:23 MSD
anonymous
( 16.08.10 13:07:25 MSD )
Ответ на: комментарий от Eddy_Em 16.08.10 13:04:45 MSD

[C] Освободить память занятую структурой.

При попытке освобождать сначала поля структуры:
free(gr->gr_name);
free(gr->gr_passwd);
Та же история:
*** glibc detected *** ./gr: free(): invalid pointer: 0x0000000012d26016 ***

milton
( 16.08.10 13:10:42 MSD ) автор топика
Ответ на: [C] Освободить память занятую структурой. от milton 16.08.10 13:10:42 MSD

Посмотрел man. Согласен с самым первым ответом. Вы вообще уверены, что тому, что возвращает getgrgid можно делать free?

А список gr_mem вы как освобождать собираетесь?

Eddy_Em ☆☆☆☆☆
( 16.08.10 13:19:28 MSD )
Ответ на: [C] Освободить память занятую структурой. от milton 16.08.10 13:10:42 MSD

Re: [C] Освободить память занятую структурой.

Бл*дь, ты ман то уже почитай по этой функции, что тебе указатель на структуру возвращает. Я тебе в первом посте уже процитировал, что далеко не факт, что там память вообще динамически аллоцируется, чтобы потом её free подсовывать.

anonymous
( 16.08.10 13:19:55 MSD )

if( (gr=getgrgid(gid)) == NULL) perror("GetGrGid "); fprintf(stdout,"Name: %s\n",gr->gr_name); free(gr); return 0; >

а можно вопрос? данная ветка кода выполняется только в том случае если у Вас (gr == NULL), то есть структура не создана, вот нафига её удалять?

и да, на будущее по code style, free() освобождает память, но не чистит значение указателя и он указывает, после free(), туда же куда и указывал, так что, хоть free() и проверяет на то что значение указателя не NULL, при попытке почистить второй раз будете получать ошибку

free(gr); gr = NULL;

shty ★★★★★
( 16.08.10 13:24:12 MSD )
Ответ на: комментарий от shty 16.08.10 13:24:12 MSD

если у Вас (gr == NULL), то есть структура не создана, вот нафига её удалять?

Это он просто так код оформил красиво, под if там только perror стоит.

dmsh
( 16.08.10 13:31:07 MSD )
Ответ на: комментарий от shty 16.08.10 13:24:12 MSD

и да, судя по отсутствию специализированной функции для удаления данной структуры, её чистка вообще не предполагается, то есть это просто набор указателей на внутренние структуры данных

shty ★★★★★
( 16.08.10 13:31:53 MSD )
Ответ на: Re: [C] Освободить память занятую структурой. от anonymous 16.08.10 13:19:55 MSD

Re: [C] Освободить память занятую структурой.

>>Бл*дь, ты ман то уже почитай по этой функции, что тебе указатель на структуру возвращает.
Бл*дь, спасибо, открыл глаза!

milton
( 16.08.10 13:33:52 MSD ) автор топика
Ответ на: комментарий от dmsh 16.08.10 13:31:07 MSD

если у Вас (gr == NULL), то есть структура не создана, вот нафига её удалять?

Это он просто так код оформил красиво, под if там только perror стоит.

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

Структура. Метод Очистить()

Метод Очистить() удаляет все элементы структуры.

Доступность

Версия Поддержка
8.1 Сервер, Клиент, Внешнее соединение
8.2 Сервер, Толстый клиент, Тонкий клиент, Веб-клиент, Внешнее соединение
8.3 Сервер, Толстый клиент, Тонкий клиент, Веб-клиент, Внешнее соединение, Мобильный автономный сервер, Мобильный клиент, Мобильное приложение

Пример использования

Пример кода с использованием метода Очистить() :

Если Структура.Количество() > 0 Тогда Структура.Очистить(); КонецЕсли; 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *