Realloc массив указателей на Struct в C

У меня есть такая структура:

struct _Total {
    Socio *socio[0];
    Libro *libro[0];
    int numsocios;
    int numlibros;
};

У меня есть практика в моем университете, и мне нужно перераспределять указатель «socio» и «libro» каждый раз, когда я добавляю данные. Например, если есть только один "socio", массив должен иметь размер 1, если я добавлю еще один "socio", мне нужно перераспределить его до размера 2, а затем добавить указатель на новую структуру (счетчик "numsocios "). То же самое и с «либро».

Я попробовал эту функцию (в файле total.c), но, очевидно, у меня ошибка типа:

STATUS total_ajustarsocio(Socio **socio, int tam) {

    Socio *temp = NULL;

    if (!socio) {
        return ERROR;
    }

    temp = (Socio *) realloc (*socio, tam * sizeof(Socio));

    if (!temp) {
        printf("Error reallocating Socio");
        return ERROR;
    }

    *socio = temp;

    return OK;
}

Итак, как я могу решить мою проблему?

P.S. Это структура Socio (в socio.c — в этом файле она также имеет функцию malloc и free).

struct _Socio {
    char nombre[MAXCAR];
    char apellido[MAXCAR];
    int dni;
    char direccion[MAXCAR];
    int tlf;
    int numprestamos;
};

Спасибо!


person Marta Garcia    schedule 07.06.2016    source источник
comment
Я не вижу никакой проблемы. Как вы думаете, почему он у вас есть?   -  person GMichael    schedule 07.06.2016
comment
У вас тоже есть typedef struct _Socio Socio;?   -  person Ian Abbott    schedule 07.06.2016
comment
Предоставьте минимально воспроизводимый пример. Также не переводите результат malloc & friends в C.   -  person too honest for this site    schedule 07.06.2016
comment
@IanAbbott Да, у меня есть это в файле social.h   -  person Marta Garcia    schedule 07.06.2016
comment
@Michael total.c: В функции «total_ajustarsocio»: total.c:186:52: ошибка: недопустимое применение «sizeof» к неполному типу «Socio» temp = (Socio *) realloc (*socio, tam * sizeof(Socio )); ^ сделать: *** [всего.o] Ошибка 1   -  person Marta Garcia    schedule 07.06.2016
comment
stackoverflow.com/q/8915230/669576   -  person Johnny Mopp    schedule 07.06.2016
comment
@Olaf Мне нужно только перераспределить что-нибудь еще. Я объясняю кое-что о том, почему мне нужно это использовать, но проблема заключается только в том, чтобы перераспределить массив, чтобы иметь возможность это сделать.   -  person Marta Garcia    schedule 07.06.2016
comment
@Marta Ваше объявление typedef struct _Socio Socio; не появляется перед объявлением total_ajustarsocio(). Пожалуйста, проверьте свой код   -  person GMichael    schedule 07.06.2016
comment
Socio *libro [0] выглядит очень, очень, очень подозрительно для меня.   -  person gnasher729    schedule 07.06.2016
comment
Глобальные идентификаторы, начинающиеся с подчеркивания, очень удобны для сокрытия деталей реализации. К сожалению, комитет по стандартам тоже так считает и зарезервировал их все. Не используйте имена, начинающиеся со знака подчеркивания для ваших типов или функций, иначе вы можете столкнуться со странными проблемами сборки.   -  person StoryTeller - Unslander Monica    schedule 07.06.2016
comment
@Michael Включение в social.h находится в файле total.h перед объявлением функции.   -  person Marta Garcia    schedule 07.06.2016
comment
@gnasher729 Социо *libro[0] похоже на Социо *libro[]   -  person Marta Garcia    schedule 07.06.2016
comment
@Maria Попробуйте заменить Socio на struct _Socio внутри realloc (*socio, tam * sizeof(Socio))   -  person GMichael    schedule 07.06.2016
comment
@Michael total.c:186:42: ошибка: недопустимое применение «sizeof» к неполному типу «struct _Socio»   -  person Marta Garcia    schedule 07.06.2016
comment
@JohnnyMopp У меня есть что-то подобное, для каждого пространства массива есть malloc структуры. total-›socio[0] = social_ini(); total-›socio[1] = social_ini(); и т. д... проблема в том, что я не могу увеличить массив от начального значения (пример с 0 в качестве размера, но другое значение допустимо... нужно только увеличить начальное значение массива указателей на Socio)   -  person Marta Garcia    schedule 07.06.2016
comment
@Marta Кажется, вы полностью определяете только struct _Socio в social.c, поэтому неудивительно, что вы получаете sizeof ошибок в total.c. Вам нужно переместить полное объявление Struct _Socio в social.h, чтобы оно было видно total.c. В качестве альтернативы вы можете переместить все функции, которым нужно знать размер struct _Socio, в social.c.   -  person Ian Abbott    schedule 07.06.2016
comment
@IanAbbott Да, теперь решено. Спасибо!   -  person Marta Garcia    schedule 07.06.2016


Ответы (1)


Ваш struct _Total неверен. Должен быть:

struct _Total {
    Socio *socio;
    Libro *libro;
    int numsocios;
    int numlibros;
};

Ваша функция total_ajustarsocio может называться примерно так:

total.numsocios++;
err = total_ajustarsocio(&total.socio, total.numsocios);
person Ian Abbott    schedule 07.06.2016
comment
Я отредактировал свой ответ после 2 голосов, так как не думаю, что мой первоначальный ответ соответствовал тому, что пытался выполнить OP. - person Ian Abbott; 07.06.2016
comment
Спасибо, я проверил это вчера, но я не могу получить доступ к массиву с этой реализацией. total.c:40:36: ошибка: разыменование указателя на неполный тип destruir_socio(total-›socio[i]); - person Marta Garcia; 07.06.2016
comment
В struct _Total: Socio *socio; должно быть struct Socio *socio; То же самое для libro. - person LPs; 07.06.2016
comment
Та же проблема с разыменованием: total.c:40:9: ошибка: неправильное использование неопределенного типа ‘struct Socio’ destruir_socio(total-›socio[i]); ^ total.c:40:36: ошибка: разыменование указателя на неполный тип destruir_socio(total-›socio[i]); - person Marta Garcia; 07.06.2016
comment
@MartaGarcia Как Socio.h включается в исходный файл c? Где объявлено struct _Total? - person LPs; 07.06.2016
comment
@LP, я предполагаю, что перед объявлением struct _Total есть typedef struct _Socio Socio и typedef struct _Libro Libro. (Марта упомянула, что Socio был объявлен с typedef, поэтому я предполагаю, что Libro также объявлен.) - person Ian Abbott; 07.06.2016
comment
@IanAbbott Я знаю, но доказательства того, что это не так, или файл, в котором объявлено struct _Total, не имеет видимости Socio typedef или struct - person LPs; 07.06.2016
comment
@LPs Я предполагаю, что компилятор выдал бы ошибки при компиляции полного объявления struct _Total, если бы типы Socio и Libro не были хотя бы частично определены в этот момент. Но да, нам нужно больше информации от Марты о порядке, в котором различные объявления встречаются в коде. - person Ian Abbott; 07.06.2016
comment
Файл total.h: #include social.h #include libro.h И, например, файл social.h: #ifndef SOCIO_H #define SOCIO_H #include ‹stdio.h› #include ‹stdlib.h› #include ‹string.h› #include types.h #define MAXCAR 100 typedef struct _Socio Socio; ФУНКЦИИ - person Marta Garcia; 07.06.2016
comment
И у Makefile есть все зависимости - person Marta Garcia; 07.06.2016
comment
@MartaGarcia Ну, проблема в видимости struct _Socio. Переместите его в Socio.h, где он естественно должен быть размещен, перед typedef. - person LPs; 07.06.2016
comment
@MartaGarcia Я понятия не имею, что должна делать ваша функция destruir_socio, поскольку она не включена в ваш вопрос. - person Ian Abbott; 07.06.2016
comment
@LP Спасибо! Да, это решение. Это из-за сокрытия имплантации, но мне не нужно это скрывать, так что теперь все решено. - person Marta Garcia; 07.06.2016
comment
@IanAbbott Не волнуйтесь, эта функция должна быть бесплатной, но работала идеально. Этот вызов находится в цикле, чтобы освободить весь массив. Теперь решено перенести определение структур в заголовочный файл. - person Marta Garcia; 07.06.2016
comment
@MartaGarcia By Этот вызов находится в цикле для освобождения всего массива, я надеюсь, вы не имеете в виду, что выделяете динамический массив с помощью malloc, calloc или realloc, а затем пытаетесь освободить каждый элемент по отдельности с помощью free, потому что это не сработает . - person Ian Abbott; 07.06.2016
comment
@MartaGarcia Хорошо. просто примечание. Если вы хотите скрыть элементы структуры, вы должны реализовать набор функций get/set, а код вне модуля не может напрямую ссылаться на переменную, которая должна быть чем-то вроде typedef void * my_hide_struct. c++ частный лайк. - person LPs; 07.06.2016
comment
@IanAbbott Это нужно только для освобождения перед выходом из программы. Спасибо! - person Marta Garcia; 07.06.2016