1

我的学校项目有问题,正在测试此构建的服务器返回此错误:

./__runscript: line 2: 489 Segmentation fault ./a.out < __input

编译是可以的,但是刚开始运行时就会显示这个错误。但是,如果我在带有 Visual Studio 10 的 Windows 7 上运行它,一切都很好。我认为错误可能出在 insert() 函数中。

POSTUP *insert(POSTUP *first)
{
    POSTUP* current,*pom;
    current=(POSTUP*)malloc(sizeof(POSTUP));
    pom=(POSTUP*)malloc(sizeof(POSTUP));
    int i,count_of_elements;

    scanf("%d", &count_of_elements);

    if(first==NULL)
    {
        first=current;
        first->array= (int*)malloc(count_of_elements*sizeof(int));
        for(i=0; i<count_of_elements; i++)
        {
            scanf("%d",&first->array[i]);
        }
        first->elements=count_of_elements;
        first->next=NULL;
        return first;
    }
    else
    {
        pom->array= (int*)malloc(count_of_elements*sizeof(int));
        for(i=0; i<count_of_elements; i++)
        {
            scanf("%d",&pom->array[i]);
        }
        pom->next=NULL;
        pom->elements=count_of_elements;
        current=first;
        while(1)
        {
            if(current->next==NULL)
            {
                current->next=pom;
                return first;
            }   
        }
    }
    return 0;
}
int main(void)
{
    int count, i;
    POSTUP* first,*current;
    first= (POSTUP*)malloc(sizeof(POSTUP));
    first=NULL;

    scanf("%d",&count);
    for(i=0; i<count; i++)
    {
        first=insert(first);

    }
}    
4

1 回答 1

1

此代码在main()

POSTUP *first, *current;
first = (POSTUP*)malloc(sizeof(POSTUP));
first = NULL;

scanf("%d", &count);
for (i = 0; i < count; i++)
{
    first = insert(first);
}

显然是有问题的。您分配空间并将唯一指向它的指针存储在first; 然后你覆盖指针,泄漏内存。您应该正式检查分配不为空。但是您的insert()代码可以处理空指针作为输入,因此 main 中的内存分配是多余的。

insert()中,您分配内存而不检查是否成功;这是一个麻烦的秘诀,尽管通常是迟到而不是早。

您的代码从不检查scanf();的结果 这意味着如果数据中存在格式错误,您可能会将垃圾放入系统中。

崩溃的可能原因:在“if (first == NULL) block ininsert()”中,您有:

    for(i=0; i<count_of_elements; i++)
    {
        scanf("%d", &prvy->array[i]);
    }

您显示的代码中看不到声明prvy&first->array[i]无论如何,它几乎肯定是指的。这很容易导致崩溃。否则,您已经小心地将数据存储在与您想象的不同的内存集中,因此数组 forfirst是未初始化的乱码。

相同的代码不使用pom,因此您在这部分代码中泄漏了内存。

在 中的主要else子句中insert(),您用 覆盖current(其中包含内存分配)first,从而也在那里泄漏内存。

在您将要使用它之前不要分配内存。

于 2012-10-07T21:30:52.497 回答