【问题标题】:malloc memory allocationmalloc 内存分配
【发布时间】:2012-12-26 15:54:02
【问题描述】:

我有一个初学者问题 我需要将一个指针传递给一个函数,然后为这个指针分配动态内存。 我在主函数中创建指针,然后将它传递给应该分配内存的特定函数。但我收到此错误: "hist_array 可能在此函数中使用未初始化"

这是程序中的相关行: 从主要:

    int* hist_array;
    fillHistogram(first_image,hist_array,max_value+1);  

功能:

    void fillHistogram(int image[M][N], int* hist, int histLen){
    hist=(int*)malloc(sizeof(histLen)*(histLen));

我无法更改函数的签名,它是作为结构化文件提供给我们的。所以我想知道我做错了什么。

还有一个问题。我用 malloc 创建的新数组,我希望它的所有值一开始都是 0。我该如何以最短的方式做到这一点?

【问题讨论】:

  • 为什么要分配空间来存储指针?无论如何,您必须将结果存储在指针中,那么为什么不将函数指针存储在那里呢?
  • 关于另一个问题,使用callocvoid *calloc(size_t nmemb, size_t size);,为nmemb 对象分配空间,每个对象大小为size,并将分配的内存归零。
  • 此作业中不允许使用 calloc
  • 我没听懂你的第一条评论
  • 你确定fillhistogram的第二个参数是int *吗?我觉得应该是int**,否则你不会改变hist_array的值。

标签: c malloc


【解决方案1】:

意图似乎是调用代码会在调用fillHistogram之前进行分配。

您的解决方案的问题是fillHistogram中的hist是您传入的指针的副本。当您更改副本时,原始仍然未初始化。

你的意思可能是sizeof(int)*histLen

【讨论】:

  • 我的目的是在 fillhistogram 函数中为 hist_array 分配内存,然后在我用它应该得到的值填充它之后将它用于其他事情。
  • 指针+数组+函数的整个组合对我来说仍然不是很清楚,所以我很难用它。
  • @littlerunaway:如果你想在fillHistogram 中分配数组,你需要某种方式从fillHistogram 返回它,这需要更改签名(你说你不能这样做) 直接返回新的 hist_array 或采用额外的int ** 参数,将写入 hist_array。
  • 你能给我一个第二个选项的例子吗?
  • 所以你基本上是说我不能在不改变签名的情况下做到这一点?
【解决方案2】:

首先,我认为您缺少括号 sizeof。 sizeof 是一个函数,它需要它的参数。并且做sizeof(histLen)*(histLen) 是告诉malloc 'reserve' sizeof(maxvalue+1),histlen 次。我认为你可能想要的是分配一个整数向量,因为hist_array 是一个指向 int 的指针。 这是通过以下方式完成的:

hist=malloc(histlen*sizeof(int)); /*I think it gets more easy to read with the lenght multiplier on the left*/

这告诉 malloc 为 histlen 整数“保留”内存。

另一件事,因为您将hist_array 作为参数传递并且您没有返回hist_array 的malloc 返回指针,您可能应该在您的函数中说您想在主函数中修改它的值。 这称为通过引用传递参数,并且要在函数内更改其值,您需要说您要更改变量的值而不是变量的副本。 这看起来像这样:

*hist=malloc(histlen*sizeof(int)); /*The pointed by hist, which hist_array, is equal to malloc etc..*/

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2013-02-23
    • 2017-12-05
    • 2013-07-04
    • 1970-01-01
    • 2022-11-10
    • 2020-12-14
    • 2021-03-13
    • 2015-02-11
    • 1970-01-01
    相关资源
    最近更新 更多