LINUX.ORG.RU

Инициализация структуры в С и выделение памяти.


0

0

Можно ли как-то сделать, чтобы сразу после декларации

struct some_structure var;

все поля структуры были обнулены?

Задача стоит примерно такая. Программа читает данные из файла 
и периодически подчитывает то, что туда успели дописать.
Сколько данных будет, наперёд не известно.
В простейшем случае, объвляем

struct {
      int ndata; // Число прочитанных данных
      int nalloc; // сколько памяти выделено
      float *array; //собственно, указатель
} some_structure;

Потом читаем файлик, и по мере надобности делаем realloc.
realloc работает, если перед первым чтением указатель
равен NULL. Но, как я понял, это не гарантируется.
приходится обнулять ручками, а это не очень удобно
(Указателей я использую десяток и структур такого рода
несколько штук)

Как это по людски сделать не прибегая к прелестям плюсов?
Можно ли в общем случае по указателю проверить, вернул ли его 
кто-то из malloc семейства?

Заранее спасибо,

Ростислав
anonymous
Ответ на: комментарий от anonymous

Так сейчас и делается. 
Хотелось бы аналог конструкции

int a=5;

Ростислав

anonymous
()

struct {
      int ndata; // Число прочитанных данных
      int nalloc; // сколько памяти выделено
      float *array; //собственно, указатель
} some_structure;

struct some_structure var={0,0,NULL};

cvv ★★★★★
()
Ответ на: комментарий от cvv

Это почти то, что нужно. Наверно, можно сделать
константу типа 

const struct some_structure z={0,0,NULL};

а потом объявлять

struct some_structure var=z;
struct some_structure var1=z;

так?

anonymous
()
Ответ на: комментарий от anonymous

попробуй. неуверен. на С++ можна.

cvv ★★★★★
()
Ответ на: комментарий от anonymous

можно так:

#define z {0,0,NULL}

а потом объявлять

struct some_structure var=z;
struct some_structure var1=z;

cvv ★★★★★
()

Я бы списочную структуру сделал, а то на realloc'ах можно зафрагментировать всю кучу -- очень неприятное явление.

anonymous_incognito ★★★★★
()
Ответ на: комментарий от idle

>struct some_structure var = {};

>struct some_structure var1 = {};

Круто. Только структуру надо с typedef определять. Иначе не работает.

Думаю, со списочной структурой, в данном случае, не стоит заморачиваться. У меня сразу выделяется заметное количество памяти и каждый следующий раз удваивается. Несколько расточительно, но зато число вызовов realloc растёт не линейно с ростом числа данных, а логарифмически. :)) Так что фрагментировать очень сильно не получится.

Второй вопрос в корневом посте пока без ответа....

Ростислав

anonymous
()
Ответ на: комментарий от anonymous

> > struct some_structure var = {};
> Круто. Только структуру надо с typedef определять. Иначе не работает.

как это не работает ??? все должно работать.

idle ★★★★★
()

Можно ли в общем случае по указателю проверить, вернул ли его кто-то из malloc семейства?

перехватываем/делаем врапперы malloc семейство и далее в перехватчиках/врапперах смотрим кто кому чего возвращал

cvv ★★★★★
()

В примере с инициализацией структуры возможно но как мне кажеться излишне. Неоптимизированный код будет приэтом делать перемещение из секции ro_data в память а в случае с одними нулями проще воспользоваться заполнялкой memset специально оптимизированной под это дело.

anonymous
()
Ответ на: комментарий от idle

Такое у меня не компилируется:
#include <stdio.h>

struct {
        int a;
        int *b;
} mystruct;

int main(){
        struct mystruct s={};
        printf("s.a=%d\n",s.a);
        return 0;
}

test.c: In function `main':
test.c:9: variable `s' has initializer but incomplete type
test.c:9: storage size of `s' isn't known

А так всё окей:
#include <stdio.h>

typedef struct {
        int a;
        int *b;
} mystruct;

int main(){
        mystruct s={};
        printf("s.a=%d\n",s.a);
        return 0;
}

Такое впечатление, что без typedef компилятор не выисляет размер
структуры...

Ростислав

anonymous
()
Ответ на: комментарий от anonymous

>   struct {
>           int a;
>           int *b;
>   } mystruct;

это вы не структуру обьявили. это вы обьявили
_переменную_ mystruct, анонимного типа.

> struct mystruct s={};

не работает потому, что такого типа (структуры)
нету.

struct mystruct {
   ...
};

struct mystruct var = {};

учите С.

idle ★★★★★
()
Ответ на: комментарий от idle

И в самом деле... Вот так и учим... :))

Ростислав

anonymous
()
Ответ на: комментарий от cvv

> > struct some_structure var = {0};
> по моему будет обнулено только первое поле

нет. все поля, для которых не указано значиние,
будут проинициализированы 0/NULL.

именно поэтому можно просто написать = {}, не знаю
зачем предыдущий оратор предлагает {0}.

idle ★★★★★
()
Ответ на: комментарий от idle

>именно поэтому можно просто написать = {}

тоесть указание "={}" гарантирует обнуление всех полей независимо от того где находится переменная???даже в стеке???

я чёто счтиал что определения "struct some_structure var = {};" и "struct some_structure var;" идентичны

cvv ★★★★★
()
Ответ на: комментарий от cvv

> тоесть указание "={}" гарантирует обнуление всех полей независимо
> от того где находится переменная???даже в стеке???

именно, очень удобно.

> я чёто счтиал что определения "struct some_structure var = {};"
> и "struct some_structure var;" идентичны

нет, во втором случае в переменной будет мусор.

idle ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.