【问题标题】:Why does my program sometimes returns 0xc0000005 and sometimes runs well?为什么我的程序有时会返回 0xc0000005 有时运行良好?
【发布时间】:2014-12-31 00:25:58
【问题描述】:

你能告诉我为什么这个程序有时会返回 0xc0000005(崩溃)并且有时运行良好吗?我是 C 的初学者,不知道出了什么问题。我正在使用 GNU GCC 编译器和 Code::Blocks。提前谢谢你。

#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<ctype.h>

typedef struct member {
int number;
char *line;
struct member *next;
}MEMBER;

typedef MEMBER *LINKED_LIST;

int main() {
char file_line [120], *str;
FILE *fi, *fo;
LINKED_LIST curr, head;
int count = 0, count_sort = 0 , end_sort, tmpint;

fi = fopen("vstup.txt","r");
if(fi == NULL){
    printf("vstup.txt - ERROR when opening file/file not found\n");
    return 0;
}
curr = (LINKED_LIST)malloc(sizeof(LINKED_LIST));
head = curr;
while(fgets(file_line,sizeof(file_line),fi))
{
    curr->number = strtol(file_line, &str,10);
    while(isspace(*str))
        str++;
    curr->line = strdup(str);
    curr->next = (LINKED_LIST)malloc(sizeof(LINKED_LIST));
    curr = curr->next;
    memset(&file_line,0,120);
    count++;
}
curr->next = NULL;
curr = NULL;
curr = head;
count_sort = count-1;
end_sort = count;
while(end_sort)
{
    if((curr->number) > (curr->next->number))
    {
        tmpint = curr->number;
        curr->number = curr->next->number;
        curr->next->number = tmpint;

        str = curr->line;
        curr->line = curr->next->line;
        curr->next->line = str;
    }
    curr = curr->next;
    count_sort--;
    if(count_sort == 0)
    {
        count_sort = count-1;
        curr = head;
        end_sort--;
    }
}
curr = head;
fclose(fi);
if (count == 0)
{
    printf("List/file is empty.\n\n");
    return 0;
}
fo = fopen("vystup.txt","w");
while(count)
{
    fprintf(fo,"%s", curr->line);
    curr = curr->next;
    count--;
}
printf("Success!\n");
fclose(fo);
return 0;
}

【问题讨论】:

  • 调试它?......
  • 您可能在某处拥有undefined behvior。在启用更多警告的情况下重新构建,并修复其根本原因并重试。如果这不起作用,请在调试器中运行以查明位置。
  • 你也有内存泄漏。当你读完最后一行时,curr-&gt;next 指向分配的内存,然后你将curr-&gt;next 重新分配给 `NULL 让你失去那个内存。
  • @datenwolf,是的。 file_line 是一个数组,它的地址和它的指针强制值相同。 & 不是必需的,但在这里无害。

标签: c crash


【解决方案1】:

你已经为指针创建了 typedef

typedef MEMBER *LINKED_LIST;

那么你已经使用 typedef 声明了几个指针

LINKED_LIST curr, head;

当您为curr 分配空间时,您可能打算为结构的副本分配空间,但您为指针分配了空间。

curr = (LINKED_LIST)malloc(sizeof(LINKED_LIST));

因此,以下行会导致未定义的行为,因为您实际上并未为结构分配空间。

    curr->number = strtol(file_line, &str,10);

故事的寓意:不要为指针创建 typedef。
旁注:也不要转换malloc的返回值。

【讨论】:

  • 为什么don't cast the return value of malloc,检查this
  • Moral of the story: don't create typedef's for pointers... 我谦虚地不同意。相反,最好使用特定的命名法类型以避免混淆,例如pLINKED_LIST。不过个人意见。
  • @Sourav Ghosh:为结构创建 typedef,然后让 '*' 星号成为任何后续使用的明显指针位。
【解决方案2】:

这行非常可疑:

if((curr->number) > (curr->next->number))

如果curr 是列表中的最后一个节点怎么办?然后你取消引用 NULL 指针。

【讨论】:

    猜你喜欢
    • 2015-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多