怎么了[动态结构C]
|
我正在尝试此代码,有时可以使用,但有时不能正常使用!
我创建了一个返回指向结构的指针的函数,然后创建了一个将单词添加到新结构的函数(添加)。
typedef int boolean;
boolean first = TRUE;
typedef struct s_Reg
{
char *str;
struct s_Reg *next;
} Reg;
Reg* CreateList()
{
Reg *list = (Reg*)malloc(sizeof(Reg));
list -> str = (char*)malloc(sizeof(char));
if (list != NULL && list -> str)
return list;
else
return NULL;
}
boolean Add(Reg *list, char *str)
{
Reg *pos = list;
if (first == TRUE)
{
list -> str = (char*)malloc(sizeof(char));
if (list -> str != NULL)
{
list -> str = str;
list -> next = NULL;
first = FALSE;
}
else
return FALSE;
}
else
{
while (pos -> next != NULL)
pos = pos -> next;
pos -> next = (Reg*)malloc(sizeof(Reg));
if (pos -> next != NULL)
{
pos = pos -> next;
pos -> str = (char*)malloc(sizeof(char));
if (pos -> str != NULL)
{
pos -> str = str;
pos -> next = NULL;
}
else
return FALSE;
}
else
return FALSE;
}
return TRUE;
}
int main()
{
boolean b;
int i;
char *str;
Reg *words = CreateList();
str = malloc(sizeof(char));
if (words == NULL)
return -1;
for (i = 1; i <= 3; ++i)
{
printf(\"\\nword: \");
gets(str);
b = Add(words, str);
if (b == FALSE)
return -1;
str = malloc(sizeof(char));
}
while (words != NULL)
{
printf(\"Word: %s\\n\", words -> str);
words = words -> next;
}
free(str);
str = NULL;
free(words);
words = NULL;
return 0;
}
如果我这样做(不使用FOR插入数据)
Add(words, \"blablablablablabla\");
Add(words, \"blablaasfsafdblblablaasfbla\");
Add(words, \"blablaasfsafdblblablaasfblaasdfasfasdf\");
每次都能正常工作!但是使用FOR插入数据,如果我插入一个长字符串,有时会崩溃!
/////// **编辑//////// **
好吧,我阅读了所有问题,谢谢大家。
我重写了代码,似乎可以正常工作(但我认为可以更好)
这是我的最终决定?码:
#include \"stdio.h\"
#include \"stdlib.h\"
#include \"string.h\"
#define TRUE 1
#define FALSE -1
typedef int boolean;
boolean first = TRUE;
typedef struct s_Reg
{
char *str;
char *str2;
char *str3;
struct s_Reg *next;
} Reg;
Reg* CreateList()
{
Reg *list = (Reg*)malloc(sizeof(Reg));
if (list != NULL)
return list;
else
return NULL;
}
boolean Add(Reg *list, char *str, char *str2, char *str3)
{
Reg *pos = list;
if (first == TRUE)
{
list -> str = (char*)malloc(strlen(str) + 1);
list -> str2 = (char*)malloc(strlen(str2) + 1);
list -> str3 = (char*)malloc(strlen(str3) + 1);
if (list -> str == NULL || list -> str2 == NULL || list -> str3 == NULL)
return FALSE;
sprintf(list -> str, str);
sprintf(list -> str2, str2);
sprintf(list -> str3, str3);
list -> next = NULL;
first = FALSE;
}
else
{
while (pos -> next != NULL)
pos = pos -> next;
pos -> next = (Reg*)malloc(sizeof(Reg));
if (pos -> next != NULL)
{
pos = pos -> next;
pos -> str = (char*)malloc(strlen(str) + 1);
pos -> str2 = (char*)malloc(strlen(str2) + 1);
pos -> str3 = (char*)malloc(strlen(str3) + 1);
if (pos -> str == NULL || pos -> str2 == NULL || pos -> str3 == NULL)
return FALSE;
sprintf(pos -> str, str);
sprintf(pos -> str2, str2);
sprintf(pos -> str3, str3);
pos -> next = NULL;
}
else
return FALSE;
}
return TRUE;
}
int main()
{
boolean b;
int i;
char str[64], str2[64], str3[64];
Reg *words = CreateList();
if (words == NULL)
return -1;
for (i = 1; i <= 3; ++i)
{
printf(\"\\nstr1: \");
gets(str);
printf(\"\\nstr2: \");
gets(str2);
printf(\"\\nstr3: \");
gets(str3);
b = Add(words, str, str2, str3);
if (b == FALSE)
return -1;
}
while (words != NULL)
{
printf(\"str1: %s\\n\", words -> str);
printf(\"str2: %s\\n\", words -> str2);
printf(\"str3: %s\\n\\n\", words -> str3);
words = words -> next;
}
free(words);
words = NULL;
return 0;
}
没有找到相关结果
已邀请:
3 个回复
坊岔埠绵
请参阅,您分配一个字节的内存。并将str传递给gets函数,这会导致一些未定义的行为
惜堡沁戚
和
。 例如,一个可能对您有所帮助的例程将是:
这将根据输入参数的长度为新字符串分配内存,然后将输入参数的内容复制到新字符串。 每次分配给结构的
字段时,都需要使用这样的代码。 您的代码中还有许多其他错误,但是现在我认为您需要退后一步,提高对指针,内存分配/取消分配等的理解。您能找到一个更简单的问题来解决,因为在当前级别上,您尝试调试此代码可能效率很低。 注意:为了便于说明,此示例中没有错误检查。
壤欠攻混