Перераспределение массива внутри структуры

Обновить

December 2018

Просмотры

394 раз

4
typedef struct {
    int count;
    int *items;
}set;

set* set_alloc(set *src, int num);
int set_insert(set *s, int num);

int main() {
    set *A = NULL;
    A = set_alloc(A, 0);
    A = set_alloc(A, 1); //this and line below is part of inserting function
    A->items[0] = 2;
    system("pause");
}   

set* set_alloc(set *src, int num) {
    if (src == NULL && num == 0) {
            set *src = (set*)malloc(sizeof(set));
        src->count = 0;
        src->items = NULL;
    }
    else {
        src->count = num;
        src->items = (int*)realloc(src->items, num*sizeof(int));
    }
    return src;
}

Код выше может выделить память для массива элементов внутри набора и для самого набора, однако, он не перераспределить этот массив элементов .. Я мог бы установить его постоянный размер, но я не хочу ходить это проблема, потому что у меня было это в предыдущих проектах.

2 ответы

2

Ваша функция никогда не возвращает вновь выделенное «*» ГНЦ из функции set_alloc см мои комментарии ниже, пожалуйста, используйте один и тот же * Передискретизация для выделения, и ваш код должен работать.

    set* set_alloc(set *src, int num) {
    if (src == NULL && num == 0) {
        set *src = (set*)malloc(sizeof(set));  ***//<--- This pointer is local to if block.***
 *//Please Correct code as =>*            src = (set*)malloc(sizeof(set));

        src->count = 0;
        src->items = NULL;
    }
    else {
        src->count = num;
        src->items = (int*)realloc(src->items, num*sizeof(int));
    }
    return src;   ***// <-- This is returning the in parameter not the malloced pointer ***
}
3

Вот:

set *src = (set*)malloc(sizeof(set));

вы повторное объявление src(в блоке сфере), вы хотите:

src = malloc(sizeof(set));

Я мог бы установить его постоянный размер, но я не хочу, чтобы обойти эту проблему, потому что у меня было это в предыдущих проектах.

Альтернатива , reallocесли вы не знаете размер заранее связанный список.