【发布时间】:2017-04-24 18:46:28
【问题描述】:
我的程序的一部分是错误的,导致分段错误。所以我想出了一个程序,它可以读取大量关于学生记录的数据,比如 ID,以及他们相应的成绩和学分。此数据存储在文本文件中。然后,在读入数据时,我的程序会创建一个学生记录的链接列表,按唯一 ID 排序。由于该学生的ID可能在文本文件中再次重复,所以我创建了一个搜索重复的函数,该函数在某处不正确,导致分段错误。这是函数:
struct SR *findDuplicate ( struct SR *head, int ID )
{
struct SR *temp = NULL;
temp = malloc ( sizeof ( head ) );
temp = head;
while ( temp->ID != ID )
{
if ( temp->next != NULL )
{
temp = temp->next;
}
else
return NULL;
}
return temp;
}
所以当我运行调试器时,它会返回以下错误消息:
Program received signal SIGSEGV, Segmentation fault.
0x0000000000400deb in findDuplicate (head=0x7fffffffe540, ID=5304) at HW7.c:101
101 while ( temp->ID != ID )
我不知道 while 循环出了什么问题。在程序中的某个地方,我将 head.ID 初始化为 -1(因为文本文件中学生的 ID 永远不会是负数)并且 head.next 为 NULL。我无法弄清楚这段代码的逻辑有什么问题。
编辑 1:我已经像这样初始化了 head(在 main 中):
struct SR head;
head.ID = -1;
head.next = NULL;
head.ID = 0;head.GPA = 0;head.numCredits = 0;head.numCoursesTakenSoFar = 0;
head.GPApoints = 0;
这个函数是从另一个从main调用的函数中调用的:
我这样调用这个函数:
ind_1 = findDuplicate ( first, a );
ind_1 被声明为指向结构的指针。
调用findDuplicate的函数是processInput函数,所以a是从文本文件中读入学生ID的变量。
编辑 2:从 main 我调用一个名为 processInput 的函数,它的一部分看起来像这样(直到第一次调用 findDuplicate ):
void processInput ( struct SR *first, char str [50] )
{
char ch;
int a, b, x=0;
struct SR *ind_1;
FILE *fp;
fp = fopen ( str, "r" );
if ( fp == NULL )
{ printf("Can't open file\n");
exit ( 1 );
}
while ( fscanf ( fp, "%d %d %c", &a, &b, &ch ) != EOF )
{
ind_1 = findDuplicate ( first, a );
在 main 中,processInput 是这样调用的:
processInput ( &head, argv [i+1] );
我希望这是足够的信息。程序真的很长,我不想放太多代码。因此,first是指向head的指针,head的地址是从main传递给processInput的。
【问题讨论】:
-
malloc电话的意义何在?它所做的只是泄漏内存。您还确定head指向有效内存吗? -
在 main 中,我将 head 声明为一个结构变量,并初始化了它的所有相应成员。应该会解决的,对吧?
-
memcpy从head到temp?为什么要使用malloc?分配的内存大小错误:您选择指针的大小,而不是结构。 -
函数的前 3 行可以简化为
struct SR *temp = head;(这也将消除您现在的内存泄漏)。所以你需要展示你如何初始化head以及你如何调用函数,错误很可能在那里 -
调试器告诉你段错误是由评估
while谓词引起的。仅当temp的当前值不是有效指针时才有意义。您提供的代码中没有任何内容可以解释为什么会这样,如果您需要进一步的帮助,请提供minimal reproducible example。
标签: c struct segmentation-fault