1

学校のプロジェクトに問題があり、このビルドをテストしているサーバーが次のエラーを返します。

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

コンパイルはOKなのですが、実行開始直後にこのエラーが表示されます。しかし、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ます。次に、ポインターを上書きして、メモリ リークを発生させます。割り当てが null ではないことを公式に確認する必要があります。ただし、insert()コードは null ポインターを入力として処理するように設定されているため、メインのメモリ割り当ては冗長です。

ではinsert()、成功をチェックせずにメモリを割り当てます。これは問題のレシピですが、通常は遅くなります。

あなたのコードはscanf();の結果をチェックしていません。つまり、データにフォーマット エラーがあると、システムにゴミが入り込む可能性があります。

考えられるクラッシュの原因:「if (first == NULL) block ininsert()」では、次のようになります。

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

prvyあなたが示すコードには、インサイトの宣言はありません。&first->array[i]とにかく、ほぼ確実に参照する必要があります。これは簡単にクラッシュに適している可能性があります。それ以外の場合は、考えていたものとは異なるメモリ セットにデータを慎重に隠しているため、配列firstは初期化されていない意味不明なものです。

同じコードは を使用していないためpom、コードのこの部分でメモリ リークが発生しています。

のメインelse句では、 (メモリ割り当てを含む) を でinsert()上書きするため、そこでもメモリ リークが発生します。currentfirst

使用するまでメモリを割り当てないでください。

于 2012-10-07T21:30:52.497 に答える