0
    double * copyTemp=NULL;
    double * output= malloc(sizeof(double*)*MallSize);
    double test1[] = {1.2,2.2,3.1};
    double test2[]={ 0.1,0.2,0.3,0.5,0.7,1.1,1.2,2.2};
    int i=0;
    int j=0;
    addArrayInOrder(test1 ,test2,output , &counter,&i , &j,size1,size2);
    ShrinkMemory ( MallSize,  counter, output ,  copyTemp );
    free(output); <- this part crashes for some reason
    return 0;

私が得ている問題は、いつか私が無料でプログラムの現金を呼ぶときです。tempをすでにNULLに設定しているので、このコードに間違いはありません。配列が指しているのはansポインターだけです。したがって、プログラムの最後にfreeを呼び出して、メモリを解放できるはずです。

関数は次のようになります

void addArrayInOrder(double *array1, double *array2, double *final, int *finalCounter, int *arry1Counter, int *array2Counter, int ArrSize1, int ArrSize2)
{

    while (*arry1Counter < ArrSize1 && *array2Counter < ArrSize2)
    {

        if (isEqual(array1, array2, *arry1Counter, *array2Counter))
        {

            *(final + *finalCounter) = *(array1 + *arry1Counter);

            arry1Counter++;
            (*array2Counter)++;
            (*finalCounter)++;;
        }
        else if (*(array1 + *arry1Counter) > *(array2 + *array2Counter))
        {

            *(final + *finalCounter) = *(array2 + *array2Counter);
            (*array2Counter)++;
            (*finalCounter)++;
        }
        else
        {
            *(final + *finalCounter) = *(array1 + *arry1Counter);
            (*arry1Counter)++;
            (*finalCounter)++;
        }
    }

}
int ShrinkMemory(int MaxSize, int MinSize, double *final, double *temp)
{
    if (MaxSize != MinSize)
    {
        temp = realloc(final, MinSize * sizeof(double *));
        if (temp == NULL)
        {
            printf("relloc failed ! exixting /n");
            return 1;
        }
        else
        {

            printf("fsafda %p \n",temp);
            printf("fsafda %p \n",final);
            final=temp;
            temp=NULL;
            printf("fsafda %p \n",temp);
            printf("fsafda %p \n",final);
        }
    }
    return 0;
}

なぜクラッシュするのですか?prinf%pを使用してメモリを印刷しましたが、アドレスは正しく見えます

4

2 に答える 2

3

doubleの配列の場合、次のようにします。

double * output= malloc(sizeof(double) * MallSize);
//                      ^^^^^^^^^^^^^^

(同様にreallocなど)

于 2013-03-18T01:20:37.327 に答える
2

final関数内で再割り当てしShrinkMemory、関数外で発生することを変更することを期待します。Cはそのようには機能しません。double **finalダブルポインタ( )を使用し、すべての参照をfinalに変更する必要があります*final

また、明確にするために、この場合の「ダブルポインター」は、何かへのポインターへのポインターを意味します(2つのアスタリスクはそれを指定します)。指摘されているもののタイプはそれとは何の関係もありません(偶然にも、ここでは「double」データ型です)

于 2013-03-18T01:21:04.227 に答える