c - malloc 有时有效,有时无效(通用链表)
问题描述
我正在创建通用链表。列表中的数据是从 .txt 文件加载的(loadClients 函数)。问题是,当我将第二个元素推送到列表(push_back 函数)时,malloc() 有时不起作用,并且出现错误 0xC0000005。例如,我运行该程序 10 次,它运行良好,但第 11 次出现错误。我什至无法检查 malloc() 返回的内容。
这是客户端结构:
typedef struct client
{
int card_no;
char last_name[30];
char first_name[30];
int phone_no;
char email[60];
char login[18];
char password[20];
bool admin;
}client_struct;
这是通用列表:
typedef struct List
{
void *data;
struct List *next;
}List;
这是 push_back 函数:
void push_back(List **head,void *data,size_t size)
{
if(*head==NULL)
{
*head = (List *)malloc(sizeof(List));
(*head)->data = malloc(size);
(*head)->data = data;
(*head)->next = NULL;
}else
{
List *current = *head;
while(current->next != NULL)
current = current->next;
printf("PUSH BACK1!\n");
current->next = (List *)malloc(sizeof(List)); //HERE IS THE PROBLEM
printf("PUSH BACK2!\n");
current->next->data = malloc(size);
current->next->data = data;
current->next->next = NULL;
}
}
这是 loadClients 函数。此函数返回指向已创建列表的指针。
List *loadClients()
{
List *client_head = NULL;
FILE *users = fopen("users.txt","r");
if(users == NULL)
return NULL;
while(!feof(users))
{
client_struct *cl = malloc(sizeof(client_struct));
memset(cl,0,sizeof(client_struct));
char tab[200];
memset(tab,0,200);
fgets(tab,200,users);
sscanf(tab,"%d %s %s %d %s %s %s %d",
&cl->card_no,cl->last_name,cl->first_name,&cl->phone_no,
cl->email,cl->login,cl->password,&cl->admin);
printf("ADD\n");
if(cl->card_no != 0)
push_back(&client_head,(client_struct *)cl,sizeof(client_struct));
}
fclose(users);
return client_head;
}
我该如何解决这个问题?
解决方案
使用调试信息(-g 标志)编译:
gcc -g code.c
然后通过 valgrind 运行它:
valgrind ./a.out
然后 valgrind 会给你很多有用的信息,比如哪里出了问题,代码的哪一行等等。
推荐阅读
- node.js - 如果已经从 fs 节点使用 AccessSync() 方法检查文件,是否还需要检查 ExistSync()?
- delphi - TIBDatabase 更改客户端库
- spring - hibernate 在 Spring 应用程序状态下验证底层数据库的内容
- r - 如何从 R 数据集中的变量中删除字符?
- postgresql - 在 CentOS 8,7 上检查 timetz 时出现 Postgresql 13.0 编译问题
- java - 计算给定输入是否落入给定值范围
- asp.net-mvc - IIS 上的 ASP.NET MVC Angular - MIME 类型配置
- prolog - 在序言中连接两个具有确定值的列表
- python - 如何从 Flask 的下拉列表中获取日期并将其作为参数传递给函数?
- google-sheets - 谷歌表格 - 日期到期的条件格式