2011-11-03 55 views
0

首先,我認爲我在下面發佈的代碼有點含糊不清,因爲我必須以讀者可以理解的方式(原始代碼非常複雜)對其進行簡化。C - realloc導致結構問題

在下面的代碼:

  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]++; 
     } 
    } 
} 

回答

1

你知道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) manual。)

3

realloc()有兩個參數 - 指針重新分配,而新的大小。你用一個參數來調用它,這是一些非常重要的未定義行爲。使用函數原型 - 即包含stdlib.h

+0

這是一個錯字,我實際的代碼我有它的第一個參數,並因此包括stdlib.h中:)問題仍然存在。 – antiopengl

+0

嗯,我試着仔細看看,看起來好像必須有*許多*錯別字。您顯示的功能不會在任何地方被調用;儘管如此,一個類似名稱的函數*被調用,所以也許就是這樣。對於所有的「拼寫錯誤」,我無法確定,但看起來很可能問題在於你將第一個參數傳遞給了'realloc()',它既不是最初從'malloc )'或'NULL'。如果你將垃圾傳遞給'realloc()',那麼可怕的事情就會發生! –

0
  • 分配的大小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);