2017-02-13 7 views
1

私は関数内の構造体ポインタの配列のために動的にメモリを割り当てようとしています。それは後に、このエラーで3反復が、クラッシュするまで動作します、いくつかの反復後のReallocの破損C

Intersection** alreadyUse = malloc(sizeof(Intersection*)); 

if(alreadyUse == NULL) { 
    exit(1); 
} 

int size = 1; 
alreadyUse[0] = inter; // Pointer of an Intersection 

// Some Code 

checkFunction(alreadyUse, &size, interLeft); 

と私が言ったように、これは

bool checkFunction(Intersection** alreadyUse, int* size, Intersection* inter) { 

    for(int i = 0; i < *size; i++) { 
     if(alreadyUse[i] == inter) { 
      return true; 
     } 
    } 

    *size = *size +1; 
    Intersection** tmp = realloc(alreadyUse, sizeof(Intersection*) * *size); 

    if(tmp == NULL){ 
     exit(1); 
    } 
    else { 
     alreadyUse = tmp; 
    } 

    alreadyUse[*size-1] = inter; 

    return false; 
} 

私の関数である。ここでは

double free or corruption (fasttop): ... 

は私の構造体ポインタ配列の宣言であります1、2、3で動作し、エラーが発生します。

誰かがそれがなぜ機能し、突然クラッシュするのか考えているのですか?

ありがとうございます。

+1

交差型は分かりません –

答えて

1

は参照によって渡されます。したがって、関数内で変更することができます。ただし、変数alreadyUseは参照渡しされません。関数は変数の値のコピーを扱います。あなたは、変数、関数内で変更されることを望む場合は、参照

checkFunction(&alreadyUse, &size, interLeft); 
       ^^^^^^^^^^^ 

ことによってそれを渡す必要がこのように関数が関数定義は

bool checkFunction(Intersection ***alreadyUse, int *size, Intersection *inter) 
{ 
    for (int i = 0; i < *size; i++) 
    { 
     if (alreadyUse[0][i] == inter) return true; 
    } 

    Intersection **tmp = realloc(alreadyUse[0], sizeof(Intersection *) * (*size + 1)); 

    if (tmp == NULL) exit(1); 

    alreadyUse[0] = tmp; 

    alreadyUse[0][(*size)++] = inter; 

    return false; 
} 
のように見えることができます

bool checkFunction(Intersection*** alreadyUse, int* size, Intersection* inter); 
        ^^^^^^^^^^^^^^^ 

のように宣言する必要があります

+0

C言語は値渡し言語であるため、 'size'が参照渡しされるとは混乱して不正確です。 'size'へのポインタは値によって渡されます。 –

+1

@DavidSchwartz参照による用語は、Cで有効かつ正確です。たとえば、「ポインタ型は、その値が参照される型のエンティティへの参照を提供するオブジェクトを表します」。 –

+0

おそらく: "...サイズ"に_reference_が渡されます... " – chux

4

alreadyUseの値をcheckFunctionに変更します。しかし、これは呼び出し元には影響しません。 reallocの呼び出しが実際に再割り当てされると、呼び出し元にはまだ解放されている古いブロックへのポインタが残っています。この関数呼び出し

checkFunction(alreadyUse, &size, interLeft); 

可変size

関連する問題