首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >realloc和free

realloc和free
EN

Stack Overflow用户
提问于 2013-03-18 09:17:22
回答 2查看 92关注 0票数 0
代码语言:javascript
复制
    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;

我得到的问题是,有时当我调用free时,程序会兑现。我在这段代码中看不到任何错误,因为我已经将temp设置为NULL,所以只有一件事指向数组,那就是ans指针。所以我应该能够在程序结束时调用free来释放内存。

该函数如下所示

代码语言:javascript
复制
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打印出了内存,地址看起来是正确的

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-03-18 09:20:37

对于双精度数组,您需要:

代码语言:javascript
复制
double * output= malloc(sizeof(double) * MallSize);
//                      ^^^^^^^^^^^^^^

( realloc等也是如此)

票数 3
EN

Stack Overflow用户

发布于 2013-03-18 09:21:04

您在ShrinkMemory中重新分配了final,并期望这会改变函数外部发生的事情。C不是这样工作的。您需要使用双指针(double **final),并将每个对final的引用更改为*final

同样要清楚的是,本例中的“双指针”表示指向某个对象的指针(两个星号指定);所指向的对象的类型与其无关(巧合的是,这里是“双精度”数据类型)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15468362

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档