【问题标题】:how free of memory happen in this case?在这种情况下如何释放内存?
【发布时间】:2010-05-03 06:27:21
【问题描述】:
#include <stdio.h>
void func(int arr[],int xNumOfElem)
{
    int j;
    for(j=0; j<xNumOfElem; j++)
    {
       arr[j] = j + arr[j];
       printf("%d\t",arr[j]);
    }
    printf("\n");
}

int main()
{

    int *a,k;
    a = (int*) malloc(sizeof(int)*10);


    for(k = 0; k<10; k++)
    {
        a[k] = k;
        printf("%d\t",a[k]);
    }
    printf("\n");

    func(a,10); //Func call

    free(a);                                                                                                                              
}

函数“func”内部将为动态数组“arr”分配/释放内存。

arr 是一个函数参数。

【问题讨论】:

    标签: c memory


    【解决方案1】:

    你不传递一个数组,你只传递一个指向 int 的指针。线

    void func(int arr[],int xNumOfElem)
    

    只是另一种写法

    void func(int* arr,int xNumOfElem)
    

    编译器本身不能为 a 的副本分配内存,因为 a 的大小是动态的,因此编译器不知道。在调用 func 后打印 a 的值以查看 a 是否已更改。

    要获取副本,请将您的 func 方法更改为:

    void func(int const* const b,int xNumOfElem)
    {
        int* arr = malloc(sizeof(int)*xNumOfElem);
        memcpy(b,arr,xNumOfElem);
        int j;
        for(j=0; j<xNumOfElem; j++)
        {
           arr[j] = j + arr[j];
           printf("%d\t",arr[j]);
        }
        printf("\n");
        free(arr);
    }
    

    【讨论】:

    • 感谢您的反馈。我得到了答案。
    【解决方案2】:

    不需要在函数fun 中为数组arr 分配内存。在调用fun 之前,数组的内存在main 函数中分配。此外,main 正在使用内存完成后释放内存;所以fun 也不需要进行解除分配。

    【讨论】:

    • 不,如果你在函数内改变它的内容,它不会反映在主函数中,它是按值传递的。所以以某种方式为“arr”创建了内存。 ???
    • 数组是按地址传递的。如果您在函数fun 中更改arr,它将反映在main 中。试试看。这表明在main 中分配的整个数组只有一个副本。
    • 否 在这种情况下不会反映!!,调用函数后打印实际数组的内容。我验证过了。
    • @Riyaz:您没有尝试正确。看看这个:ideone.com/YhMtG
    【解决方案3】:

    这样想:

    void func(int arr[],int xNumOfElem)
    {
        int j;
        for(j=0; j<xNumOfElem; j++)
        {
           arr[j] = j + arr[j];
           printf("%d\t",arr[j]);
        }
        printf("\n");
    }
    

    相当于:

    void func(int *arr /* look here */,int xNumOfElem)
    {
        int j;
        for(j=0; j<xNumOfElem; j++)
        {
           arr[j] = j + arr[j];
           printf("%d\t",arr[j]);
        }
        printf("\n");
    }
    

    【讨论】:

    • 我有这个疑问,因为在某些 hdl laguage 数组可以按值传递或按引用传递。我也通过分配 a[k] = k; 在这个 c 文件中犯了错误。在调用函数 func() 之后。所以价值观在这里再次发生变化。好的,我将关闭此问题。谢谢!!
    猜你喜欢
    • 2014-05-10
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多