我使用此代码获得了段错误:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <dirent.h>
#include <unistd.h>
typedef struct _node
{
char *buffer;
struct _node *next;
int node_count;
} node;
typedef struct _list
{
node *head;
node *tail;
} list;
list *node_list;
int list_node_lookup(list *l, char *buffer)
{
node *temp = l->head;
while(temp)
{
if (strcmp(temp->buffer, buffer) == 0)
{
/* We got it earlier */
temp->node_count++;
return 1;
}
else
{
temp = temp->next;
}
}
return 0;
}
int adding_to_list(list *l, char *buffer)
{
int ret;
char *tmp = (char *)malloc(sizeof(char)*(strlen(buffer) + 1));
node *new_node = (node *)malloc(sizeof(struct _node));
/* Empty list */
if (l->head == NULL)
{
strcpy(tmp, buffer);
new_node->buffer = tmp;
new_node->node_count = 0;
l->head = l->tail = new_node;
l->head->next = NULL;
}
else
{
/* The list is not empty */
ret = list_node_lookup(l, buffer);
if (ret == 1)
{
fprintf(stdout, "Got it before\n");
}
else
{
strcpy(tmp, buffer);
new_node->buffer = tmp;
new_node->node_count = 0;
l->tail->next = new_node;
l->tail = new_node;
new_node->next = NULL;
fprintf(stdout, "Adding this cust : %s\n", buffer);
}
}
return 0;
}
int main(int argc, char **argv)
{
FILE *cust;
char buf[BUFSIZ];
DIR* cust_dir;
struct dirent* input;
node_list = (list *) malloc(sizeof(struct _list));
if (node_list == NULL)
{
return 1;
}
node_list->head = node_list->tail = NULL;
if (NULL == (cust_dir = opendir("cust_dir")))
{
return 1;
}
while ((input = readdir(cust_dir)))
{
if (!strcmp (input->d_name, "."))
continue;
if (!strcmp (input->d_name, ".."))
continue;
cust = fopen(input->d_name, "r");
while (fgets(buf, BUFSIZ, cust) != NULL)
{
adding_to_list(node_list, buf);
}
fclose(cust);
}
return 0;
}
当我用包含这两个文件的目录(它们包含空行)测试我的代码时,我得到了奇怪的输出和seg错误。
我在同一目录中使用此文件两次(customers.txt和customers_copy.txt):
1
2
3
4 Kristina Chung H Kristina H. Chung Chung, Kristina H.
5 Paige Chen H Paige H. Chen Chen, Paige H.
6 Sherri Melton E Sherri E. Melton Melton, Sherri E.
7 Gretchen Hill I Gretchen I. Hill Hill, Gretchen I.
8 Karen Puckett U Karen U. Puckett Puckett, Karen U.
9 Patrick Song O Patrick O. Song Song, Patrick O.
10 Elsie Hamilton A Elsie A. Hamilton Hamilton, Elsie A.
11
12 Hazel Bender E Hazel E. Bender Bender, Hazel E.
13
前三行是空的(当我使用一个文件时一切正常,但这个多个文件我得到了段错误。)
感谢您的帮助,了解错误。
答案 0 :(得分:1)
将节点添加到列表(到列表的尾部)时,不要将该节点的next
指针设置为NULL。这意味着下次进行查找时,您将使用无效指针调用strcmp
。这本身可能会导致分段错误。
简单的解决方案是在分配节点后立即将next
设置为NULL。
此外,如果节点已在列表中,则分配tmp
但从不使用它。这会泄漏记忆。这类似于Greg Brown的评论 - 你也在泄漏文件描述符和文件句柄(你永远不会关闭cust
)。
<强> [编辑] 强>
问题是您正在读取目录“cust_dir”,因此您将获取目录中文件的名称(例如“customers.txt”)。然后打开文件而不将“cust_dir /”添加到文件名。
因此,如果不小心您在当前目录中也有该文件,则可以正常工作。但除此之外,cust
为NULL(因为input->d_name
是“cust_dir”内的文件名,而不是当前目录中的文件名,然后您尝试从NULL文件指针读取数据。这会导致分段错误。