2017-04-13 64 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'代替 –