什么';这里怎么了?[动态结构C]
我正在尝试这段代码,它有时是有效的,但有时它并不好用! 我创建了一个返回指向结构的指针的函数,然后创建了一个将单词添加到新结构的函数(Add)什么';这里怎么了?[动态结构C],c,dynamic,structure,C,Dynamic,Structure,我正在尝试这段代码,它有时是有效的,但有时它并不好用! 我创建了一个返回指向结构的指针的函数,然后创建了一个将单词添加到新结构的函数(Add) 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));
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插入数据时,如果插入长字符串,有时会崩溃
//编辑////////**
好的,我看了所有的问题,谢谢大家。
我重写了代码,它似乎可以工作(但我认为它可以更好)
这是我的期末考试吗?代码:
#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;
}
#包括“stdio.h”
#包括“stdlib.h”
#包括“string.h”
#定义真1
#定义FALSE-1
typedef int boolean;
布尔值优先=真;
类型定义结构s_Reg
{
char*str;
char*str2;
char*str3;
结构s_Reg*下一步;
}注册;
Reg*CreateList()
{
Reg*列表=(Reg*)malloc(sizeof(Reg));
如果(列表!=NULL)
退货清单;
其他的
返回NULL;
}
布尔加法(Reg*列表、char*str、char*str2、char*str3)
{
Reg*pos=列表;
if(first==TRUE)
{
列表->str=(char*)malloc(strlen(str)+1);
列表->str2=(char*)malloc(strlen(str2)+1);
列表->str3=(char*)malloc(strlen(str3)+1);
如果(列表->str==NULL | |列表->str2==NULL | |列表->str3==NULL)
返回FALSE;
sprintf(列表->str,str);
sprintf(列表->str2,str2);
sprintf(列表->str3,str3);
列表->下一步=空;
第一个=假;
}
其他的
{
while(位置->下一步!=空)
pos=pos->next;
pos->next=(Reg*)malloc(sizeof(Reg));
如果(位置->下一步!=空)
{
pos=pos->next;
pos->str=(char*)malloc(strlen(str)+1);
pos->str2=(char*)malloc(strlen(str2)+1);
pos->str3=(char*)malloc(strlen(str3)+1);
如果(pos->str==NULL | | pos->str2==NULL | | pos->str3==NULL)
返回FALSE;
sprintf(pos->str,str);
sprintf(pos->str2,str2);
sprintf(pos->str3,str3);
pos->next=NULL;
}
其他的
返回FALSE;
}
返回TRUE;
}
int main()
{
布尔b;
int i;
字符str[64]、str2[64]、str3[64];
Reg*words=CreateList();
if(words==NULL)
返回-1;
对于(i=1;i-str);
printf(“str2:%s\n”,words->str2);
printf(“str3:%s\n\n”,words->str3);
单词=单词->下一步;
}
免费(字);
单词=空;
返回0;
}
您的整个字符串处理代码都是错误的。只能为单个字符分配内存。然后你就泄露了记忆
在处理此类代码之前,您需要回到基础知识,学习如何使用malloc()
和strncpy()
例如,可能对您有所帮助的例程如下:
char* AllocStr(char *str)
{
size_t len;
char *result;
len = strlen(str)+1;//add one for zero-terminator
result = malloc(len);
return strncpy(result, str, len);
}
这将根据输入参数的长度为新字符串分配内存,然后将输入参数的内容复制到新字符串
每次分配给结构的str
字段时,都需要使用如下代码
您的代码中还有很多其他bug,但现在我认为您需要后退一步,提高对指针、内存分配/释放等的理解。您能否找到一个更简单的问题来解决,因为在您当前的级别上,尝试调试此代码可能效率非常低
注意:为了便于说明,此示例中没有错误检查。您的整个字符串处理代码都是错误的。只能为单个字符分配内存。然后你就泄露了记忆
str = malloc(sizeof(char))
在处理此类代码之前,您需要回到基础知识,学习如何使用malloc()
和strncpy()
例如,可能对您有所帮助的例程如下:
char* AllocStr(char *str)
{
size_t len;
char *result;
len = strlen(str)+1;//add one for zero-terminator
result = malloc(len);
return strncpy(result, str, len);
}
这将根据输入参数的长度为新字符串分配内存,然后将输入参数的内容复制到新字符串
每次分配给结构的str
字段时,都需要使用如下代码
您的代码中还有很多其他bug,但现在我认为您需要后退一步,提高对指针、内存分配/释放等的理解。您能否找到一个更简单的问题来解决,因为在您当前的级别上,尝试调试此代码可能效率非常低
注意:为了便于说明,此示例中没有错误检查
str = malloc(sizeof(char))
看,您分配了一个字节的内存。并将str传递给get函数,这会导致一些未定义的行为
看,您分配了一个字节的内存。并将str传递给get函数,这会导致一些未定义的行为您还必须查看内存管理。实际上,当您创建列表时,会为字符串分配内存。然后,调用Add函数,并在first==TRUE时分配内存,这不正确,因为已分配…您还必须查看内存管理。实际上,当您创建列表时,会为字符串分配内存。然后,调用Add函数,并在first==TRUE时分配内存,这与已分配的内存不符…当它崩溃时,您会收到什么消息?您是否尝试过在调试器中单步执行程序?或者添加有用的
printf
语句,以便监视其进度?当它崩溃时,您会收到什么消息?您是否尝试过在调试器中单步执行程序?或者添加有用的printf
语句,以便您可以监控其进度?如果您认为这是问题的解决方案,那么您就被误导了。当然,这是错误的,但如果您像代码当前那样立即丢弃内存,那么分配多少内存又有什么关系呢。@david您给了他一个很好的解决方案,即使我对您的答案投了+1票。但是什么呢