【问题标题】:malloc not allocating properly with pointer to pointermalloc 没有正确分配指向指针的指针
【发布时间】:2013-04-27 07:59:32
【问题描述】:

我正在尝试创建一个分配特定大小内存的函数。在主程序中,我创建指针,然后将指针和大小发送给函数以分配内存。由于某种原因,它会导致各种问题。如果我在 main 中使用 malloc,但不是通过函数,我的程序可以顺利运行。

int main(void){
    int * pointer;
    int array_size = SIZE;
    ...
    allocate_memory(&pointer,array_size);
    ...
    free(pointer);
}

allocate_memory(int *pointer,int size){
    *pointer = (int *)malloc(size*sizeof(int));
    if(!(*pointer)){
        printf("Memory allocation fail!");
        exit(0);
    }

现在的问题是当我尝试释放内存时它给了我一个错误。 如果解决方案附有简短的解释,我将不胜感激。我开始对这些指针和铸件的工作方式感到非常困惑。 提前致谢!

【问题讨论】:

  • 拿起任何一本标准的书。整个pointer to pointerpointer to variable的东西都用图形、数字和基本代码很好地解释了。

标签: c pointers casting malloc free


【解决方案1】:

我要指出你的程序中有很多错误:

  1. 您需要#defineSIZE,否则程序将不知道它是什么。

  2. 最好声明函数allocate_memory()的原型,以便检测到参数类型或返回类型的任何差异

  3. 您已将 &pointer 作为参数传递给 main() 中的 allocate_array()。为此,需要将函数定义为 allocate_memory(int **pointer,int size) 而不是您所做的 allocate_memory(int *pointer,int size)
  4. if(*pointer==NULL) 以更简单的方式实现条件,并起到相同的作用。
  5. 使用exit(1) 表示不成功终止,因为exit(0) 用于表示成功终止。
  6. 永远不要忽略警告。这不是一个好习惯。

这是更正后的代码。它编译良好,没有警告,并按预期完成工作(内存分配)。

    #include<stdio.h>
    #include<stdlib.h>
    #define SIZE 30

    void allocate_memory(int**,int);

    int main(void){
        int * pointer;
        int array_size = SIZE;
        allocate_memory(&pointer,array_size);
        free(pointer);
    }

    void allocate_memory(int **pointer,int size)
    {
        *pointer = malloc(size*sizeof(int));
        if(*pointer==NULL)
        {
            printf("Memory allocation fail!");
            exit(1);
        }
        else
            printf("\nMemory allocation successful");


    }

【讨论】:

  • 感谢您的回答。我对这个论坛很陌生,因此我愚蠢地认为我不必将我的原型添加到我提供的代码中。在我的代码中,这些原型确实存在。我只是假设人们会把它们解释为既定的。
  • @AYR 欢迎来到 StackOverflow。即使是初学者提出的好的和真诚的问题,这里的人们也很感激。
  • @SheerFish -1 ,造成内存泄漏不好,您还会对free( pointer ) 造成未定义的行为。请记住,C 中的变量是按值传递的。您缺乏 C 的基本知识。如果您不同意,我只会尽力帮助您,我们可以为聊天加注星标,我会很乐意解释。
  • @SheerFish 再次,您的带有 printf 的代码在 main 中清楚地显示了指针并没有改变。 ideone.com/gvzURO
猜你喜欢
  • 1970-01-01
  • 2012-08-17
  • 2018-05-16
  • 1970-01-01
  • 2017-05-13
  • 2023-03-10
  • 1970-01-01
  • 1970-01-01
  • 2014-08-23
相关资源
最近更新 更多