gpt4 book ai didi

c - 这里出了什么问题? [动态结构 C]

转载 作者:太空宇宙 更新时间:2023-11-04 06:42:30 25 4
gpt4 key购买 nike

我正在尝试这段代码,它有时可以工作,但有时却不能正常工作!我创建了一个返回指向结构的指针的函数,然后我创建了一个将单词添加到新结构的函数 (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));
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;
}

最佳答案

您整个字符串处理代码都是错误的。您仅为单个字符分配内存。然后你泄露了那段内存。

在处理这样的代码之前,您需要回到基础并学习如何使用 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 字段时,您都需要使用这样的代码。

你的代码中还有很多其他错误,但现在我认为你需要退后一步,提高你对指针、内存分配/解除分配等的理解。你能找到一个更简单的问题来解决吗,因为在你目前的水平上, 尝试调试此代码可能效率很低。

注意:为了便于说明,此示例中没有错误检查。

关于c - 这里出了什么问题? [动态结构 C],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5848617/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com