2017-04-13 102 views
-1

我想要一個基本上持有一個字符串(而不是一個字符數組)的鏈接列表。我不斷收到分段錯誤(核心轉儲),我不知道在哪裏/當letter定義爲char letter;和你的編譯器可以讓你做string->letter = malloc(sizeof(char));沒有抱怨,這意味着我如何分配內存錯誤鏈接列表的C內存分配

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

struct mystring 
{ 
    char letter; 
    int size; 
    int isHead; 
    struct mystring*next; 
}; 

struct mystring * create_empty_string(int size) 
{ 
    struct mystring * string = malloc(sizeof(struct mystring)); 
    string->size = size; 
    string->isHead = 0; 
    return string 
} 

struct mystring * make_string(struct mystring * list,char * string) 
{ 
    for(int i = 0 ; i < strlen(string) ; i++) 
    { 
     list->letter= string[i]; 
     list = list->next; 
    } 
    return list; 
} 
void printList(struct mystring* list) { 

    //start from the beginning 
    while(list->letter != '\0') { 
     printf("(%c) ",list->letter); 
     list = list->next; 
    } 
} 
int main() 
{ 
    struct mystring * string = create_empty_string(10); 
    string = make_string(string, "hey"); 
    printList(string); 
} 
+0

設置較高的警戒級別並注意警告。例如,'.. \ main.c:19:1:error:control reach non-void function'(當函數返回時,函數不返回任何東西) –

+1

'string-> letter = malloc(的sizeof(char)的);」沒有。你從編譯器得到了多少錯誤/警告? – ThingyWotsit

+0

2014.c:18:17:warning:指向從'void *'分配給'char'的整數轉換的不兼容指針 string-> letter = malloc(sizeof(char)); ^ ~~~~~~~~~~~~~~~~~~~~ 2014.c:21:1:警告:控制達到非無效功能的結束[-Wreturn-type] }這些是我得到的兩個警告 – realicado

回答

0

如上所述,您的create_empty_string()函數構造得很差。我建議通過將單個字符提供給一個名爲append_to_string()或類似的函數來一次構建一個鏈接列表,這將創建一個新節點並將其鏈接到之前構建的列表(如果它是第一個節點,則成爲列表本身)。

1

您正在嘗試編譯時沒有啓用最輕微的警告。你不會那麼做。弄清楚如何在編譯器上啓用全部警告,然後可能會對警告進行一些處理以禁用真正令人討厭的警告,從此編譯器將幫助您避免執行分配結果爲malloc()char

+0

哦,太棒了,看來你收到了警告,你忽略了它們,然後你把它帶到了stackoverflow,詢問有什麼問題。我會給你另一個提示:開始使​​用編譯器的「把所有警告作爲錯誤」選項,從那時起編譯器會幫助你避免忽略這些警告 –

+0

好吧,我已經更新了我的代碼並且沒有任何警告,仍然不知道爲什麼我要核心轉儲 – realicado

+0

'while(list-> letter!='\ 0')'繼續循環直到'letter'爲''\ 0'',但是您從未將它設置爲''\ 0''所以它永遠不會停止循環,另一方面,你總是執行'list = list-> next;'所以你走出你的列表的末尾並進入void。 NULL'代替 –