C - realloc вызывает проблему со структурой - PullRequest
0 голосов
/ 03 ноября 2011

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

В коде ниже:

  1. Есть список из 10 предметов.
  2. Каждый элемент имеет список информации о нем.
  3. У каждой информации есть список имен.

Итак, я пытаюсь заполнить список элементов, но мне не удалось перераспределить память в строке, которую я пометил «<<<<». Нет ошибки компиляции, но когда я распечатываю имена всех элементов, они не распечатываются. Я провел некоторую отладку, и я почти уверен, что строка "<<<<" вызывает ошибку, но я не знаю, почему.

typedef struct {
    char *name;
} NAME;

typedef struct {
    int id;
    int nNames;
    NAME *names;
} INFO;

typedef struct {
    INFO *info;
} ITEM;

void *buildListInfo(LIST *list) {
    if (list != NULL) {
        list->nNames++;
        list->names = realloc(list->names, sizeof(INFO) * list->nNames++);  // <<<<
        list->names[list->nNames-1].name = "example"; // index 0 first
    }
    return list;
}

int main() {
    int itemSize = 10;
    ITEM *items = malloc(sizeof(ITEM)*itemSize);

    for (int i = 0; i < ind->nTerms; i++) {
        items[i].info = malloc(sizeof(INFO));
    }

    /* construct an array that holds the number of lists that an item has */
    int num[itemSize];
    for (int i = 0; i < itemSize; i++) {
        num[i] = 0;
    }

    /* build all items, each item has a list that contains its info (many) */
    while (<some_finite_condition>)
        for (int i = 0; i < itemSize; i++) {
            items[i].info[num[i]] = *buildList(&(items[i].info[list[i]]));
            num[i]++;
        }
    }
}

Ответы [ 3 ]

3 голосов
/ 03 ноября 2011

realloc() принимает два аргумента - указатель для перераспределения и новый размер. Вы называете это одним аргументом, и это довольно серьезное неопределенное поведение. Используйте прототипы функций, т.е. включайте stdlib.h!

1 голос
/ 03 ноября 2011

Вы знаете, что realloc() принимает два аргумента, верно? Прототип -

void *realloc(void *ptr, size_t size);

например.,

 newsize = size + 50;
 if ((newp = realloc(p, newsize)) == NULL) {
      free(p);
      p = NULL;
      size = 0;
      return (NULL);
 }
 p = newp;
 size = newsize;

(из руководства OpenBSD realloc (3) .)

0 голосов
/ 03 ноября 2011
  • Выделите для элементов размером NAME, а не INFO

  • Вы увеличиваете nNames в два раза; и когда вы делаете list->names[list->nNames-1], вы делаете переполнение буфера.

Попробуйте изменить следующие строки:

    list->names = realloc(list->names, sizeof(INFO) * list->nNames++);

от

    list->names = realloc(list->names, sizeof(NAME) * list->nNames);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...