链表的C内存分配
C memory allocation for linked list
我正在尝试创建一个基本上包含字符串(而不是字符数组)的链表。我不断收到分段错误(核心已转储)并且我不确定 where/how 我分配内存错误
#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 != '[=10=]') {
printf("(%c) ",list->letter);
list = list->next;
}
}
int main()
{
struct mystring * string = create_empty_string(10);
string = make_string(string, "hey");
printList(string);
}
当 letter
被定义为 char letter;
并且您的编译器允许您执行 string->letter = malloc(sizeof(char));
而不会抱怨时,这意味着您正在尝试在不启用任何警告的情况下进行编译。你不会那样走得太远。弄清楚如何在你的编译器上启用 all 警告,然后可能会稍微处理警告以禁用真正烦人的警告,从那一刻起在你的编译器上将帮助你避免做一些无意义的事情,比如将 malloc()
的结果分配给 char
.
如前所述,您的 create_empty_string() 函数构造不当。我建议通过将单个字符输入一个名为 append_to_string() 或类似函数的函数来构建 linked 列表,一次一个节点,这将创建一个新节点并将其 link 到先前的构造列表(如果它是第一个节点,则成为列表本身)。
我正在尝试创建一个基本上包含字符串(而不是字符数组)的链表。我不断收到分段错误(核心已转储)并且我不确定 where/how 我分配内存错误
#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 != '[=10=]') {
printf("(%c) ",list->letter);
list = list->next;
}
}
int main()
{
struct mystring * string = create_empty_string(10);
string = make_string(string, "hey");
printList(string);
}
当 letter
被定义为 char letter;
并且您的编译器允许您执行 string->letter = malloc(sizeof(char));
而不会抱怨时,这意味着您正在尝试在不启用任何警告的情况下进行编译。你不会那样走得太远。弄清楚如何在你的编译器上启用 all 警告,然后可能会稍微处理警告以禁用真正烦人的警告,从那一刻起在你的编译器上将帮助你避免做一些无意义的事情,比如将 malloc()
的结果分配给 char
.
如前所述,您的 create_empty_string() 函数构造不当。我建议通过将单个字符输入一个名为 append_to_string() 或类似函数的函数来构建 linked 列表,一次一个节点,这将创建一个新节点并将其 link 到先前的构造列表(如果它是第一个节点,则成为列表本身)。