c - malloc 未使用指向指针的指针正确分配

标签 c pointers casting malloc free

我正在尝试创建一个分配特定大小内存的函数。总的来说,我创建了指针,然后将指针和大小发送到要分配内存的函数。由于某种原因,它会导致各种问题。如果我在 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);
    }

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

最佳答案

我指出了您的程序中的许多错误:

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

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

  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");


    }

关于c - malloc 未使用指向指针的指针正确分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16249740/

相关文章:

c++ - 使用 malloc 和 void 指针复制临时结构

c++ - 当我只有一个指向数据的空指针时,使用 printf 打印字符

java - 为什么 Java 的 +=、-=、*=、/= 复合赋值运算符不需要转换?

c - 在 c 中的 uint64_t 中设置位

c - 从数组循环中获取最小和最大标签

c++ - clang++ 是否以更宽松的方式对待系统头?

c - GCC ARM C 编译器不遵守 -std=c99 的 %llx printf 格式化代码

java - JNA 中的 typedef 结构指针

c# - C#—在Convert.ToInt32(...)之后,循环将不接受非数字输入

java - 在java中将原始类型数组转换为对象数组