2013-10-12 73 views
0

我需要在我的程序中使用鏈表的算法。我會很快解釋它需要做什麼:當函數被多次使用時程序崩潰

我的程序生成一個最大尺寸爲2.000的字符串。我需要創建以下類型元素的鏈表:

typedef struct List * News; 


struct List { 
char * Text; 
News next; 
} ; 

由於結構的最大尺寸爲2.000,把一個結構是我的文本字段的信息,我想使用的確切大小的結構。所以,我提出了以下函數來創建和我的鏈接列表的頂部添加一個元素:運行時

void InsertLL (News p, char M[]){ 

char * text = (char *)malloc(strlen(M) * sizeof(char)); 
strcpy(text, M); 
News s,t; 
t = malloc(sizeof(struct List)); 
t-> Text = text; 
s=p; 
p=t; 
t -> next = s; 

} 

在一個無限循環的程序運行,而此前,它崩潰。沒有函數InsertLL,它運行良好(例如,如果我不關心結構的大小並將其直接放在我的元素上)。在調試模式下,它不會崩潰,所以我認爲這是一種我無法解決的內存問題。

有什麼我做錯了,當我打電話malloc?

感謝您的幫助!

+0

'字符*文本= malloc的(1+的strlen(M));'' – wildplasser

回答

1

您沒有爲空終止符分配空間。分配字符串時,將strlen()+ 1傳遞給malloc。請記住,strlen()返回字符串的長度,不包括空終止字符。

請注意,sizeof(char)的定義是1,而您的should not cast the return value of malloc。 您的代碼應該是

char * text = malloc(strlen(M) + 1); 
3

您沒有爲文本分配足夠的空間。您應該考慮空字符的空間,以便分配strlen(M)+1個字節。

sizeof(char)總是一個字節,您不需要對malloc結果進行類型轉換,因爲void *會自動且安全地提升爲任何其他指針類型。

更改代碼以char * text = malloc(strlen(M)+1);

+2

的sizeof(char)的'是隱式的爲一個,因此是冗餘的並且沒有良好的能來通過鑄造'malloc'的返回值。 – Kunal

+0

我只是重構他的代碼。也許這只是一個附註。 –

相關問題