2015-05-04 25 views
0
 *MyFile.h* 

     typedef char* dado_t; 
     typedef struct elemento elemento; 
     typedef struct lista2 lista2; 

    *MyFile.c* 

    struct elemento{ 
     dado_t str; 
     elemento* ant; 
     elemento* prox; 
    }; 

    struct lista2{ 
     elemento* primeiro; 
     elemento* ultimo; 
     elemento* corrente; 
    }; 

    void_insert(lista2* l, dado_t d){ 
     elemento* novo = malloc(sizeof(elemento*)); 
     novo->str = malloc(strlen(d) * sizeof(char)); 
     novo->str = d; 
     l->corrente = novo; 
     l->primeiro = novo; 
     l->ultimo = novo; 
     novo->prox = NULL; 
     novo->ant = NULL; 

    } 

dado_t replace(lista2* l, dado_t d){ 
    dado_t retorno = malloc(strlen(corrente->str) * sizeof(dado_t)); 
    retorno = corrente->str; 

    corrente->str = realloc(corrente->str, strlen(d) * sizeof(char)); 
    l->corrente->str = d; 
    return retorno; 
} 

爲什麼我得到此錯誤?由於myel->str是已分配malloc()的指針。爲什麼錯誤?我使用的是臨時元素*如果錯誤與realloc()的Realloc無效的指針。已終止(核心轉儲)

觀測數據碰巧被阻止:

+0

你已經在malloc後面設置了'myel-> str' d – Dinesh

+0

@Dinesh是的,但是錯誤發生在編譯器到達那裏之前...... = s – PlayHardGoPro

+0

你是否想分享一點你的代碼,因爲調用序列尚不清楚。也許 - realloc之前 - 只需打印myel-> str和d - 可能會提供一些線索 – Dinesh

回答

1

類型dado_tchar *,這最初點什麼(我的意思是,不是NULL但是一些隨機值)。長度的C字符串d需要爲終止零單個字節以上存儲器:你正確

novo->str = malloc(strlen(d) * sizeof(char)); 

具有一個微小的誤差分配一些存儲器它。因此,將其更改爲這裏

novo->str = malloc(strlen(d)+1); 

有兩點需要注意:sizeof(char)是保證1(我認爲這是在規格,話又說回來,也沒有壞處,也許你要確保你有語法權當分配int或其他更大的類型)。
其次,大多數標準庫都具有這樣的功能:strdup。所有你需要做的就是用你的字符串地址來調用它,它本身就是+1部分。

但是,下一行是更嚴重的錯誤:

novo->str = d; 

在C你不能「分配」一個串到另一個這樣。如果你想這樣做,你可以將地址分配給另一個字符串。這可能會導致無法預料的問題,例如爲地址分配一個常量字符串(這是有效的,但無法修改它),或者更糟糕的是,在「本地」堆棧中的函數內創建的字符串。

在這種情況下,你想從函數的參數存儲字符串d的完整副本,因此會使用

strcpy (novo->str, d); 

不要忘了,這個指針將被「丟失」如果你永遠免費的結構novo。 「丟失」指針是先前分配的內存塊(在字符串malloc一行中),但不再有指向的有效變量。因此,在解除您的elemento列表時,請先致電free(xx->str)

如果您確保該str元素總是設置爲NULL只要你創建一個新的elemento結構,你可以安全地調用free,即使它可能是NULL串; free可以處理。實際上,您似乎總是分配一個值,所以這裏不是這種情況,但總的來說,我發現明確清除新創建的結構是安全的,例如memset (novo, 0, sizeof(elemento));

2

隨着elemento* novo = malloc(sizeof(elemento*));你的malloc只是空間的指針,但是然後把它作爲一個結構空間。這會覆蓋堆上的簿記信息。

1

Peter Schneider正確地指出elemento* novo = malloc(sizeof(elemento*))只爲指針分配了足夠的空間(因爲這就是elemento*);在這種情況下,有兩種常見的成語,其中任何一個在這裏做精:

  • elemento* novo = malloc(sizeof(elemento))
  • elemento* novo = malloc(sizeof(*novo))

當然,你需要採取Jongware的意見呢!