Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
malloc未使用指针对指针正确分配_C_Pointers_Casting_Malloc_Free - Fatal编程技术网

malloc未使用指针对指针正确分配

malloc未使用指针对指针正确分配,c,pointers,casting,malloc,free,C,Pointers,Casting,Malloc,Free,我试图创建一个函数来分配特定大小的内存。在main中,我创建了指针,然后将指针和大小发送给要分配内存的函数。出于某种原因,它导致了各种各样的问题。如果我在main中使用malloc,但不是通过函数,那么我的程序工作得很顺利 int main(void){ int * pointer; int array_size = SIZE; ... allocate_memory(&pointer,array_size); ... free(point

我试图创建一个函数来分配特定大小的内存。在main中,我创建了指针,然后将指针和大小发送给要分配内存的函数。出于某种原因,它导致了各种各样的问题。如果我在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);
    }
现在的问题是,当我试图释放内存时,它会给我一个错误。 如果能给出一个简短的解释,我将不胜感激。我开始对这些指针和铸件是如何工作的感到非常困惑。
提前谢谢

您的程序中有许多错误,我要指出:

  • 您需要定义宏的大小,否则程序就不知道它是什么

  • 最好声明函数的原型
    allocate\u memory()
    ,以便检测参数类型或返回类型中的任何差异

  • 您已在
    main()
    中将
    &pointer
    作为参数传递给
    allocate\u array()
    。为此,需要将函数定义为
    allocate\u memory(int**pointer,int size)
    而不是您所做的
    allocate\u memory(int*pointer,int size)
  • if(*pointer==NULL)
    以一种更简单的方式实现该条件,并达到相同的目的
  • 使用
    exit(1)
    终止失败,因为
    exit(0)
    用于表示成功终止
  • 永远不要忽视警告。这不是一个好的做法
  • 下面是正确的代码。它编译得很好,没有警告,并且按照预期完成了任务(内存分配)

        #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");
    
    
        }
    
    #包括
    #包括
    #定义尺寸30
    无效分配内存(int**,int);
    内部主(空){
    int*指针;
    int数组_size=大小;
    分配内存(&指针、数组大小);
    自由(指针);
    }
    无效分配内存(整数**指针,整数大小)
    {
    *指针=malloc(大小*sizeof(int));
    如果(*指针==NULL)
    {
    printf(“内存分配失败!”);
    出口(1);
    }
    其他的
    printf(“\n内存分配成功”);
    }
    
    谢谢您的回答。我是这个论坛的新手,因此我愚蠢地认为我不必将原型添加到我提供的代码中。在我的代码中,这些原型确实存在。我只是假设人们会把它们当作是给定的来解释。@AYR欢迎来到StackOverflow。这里的人们喜欢好的、真诚的问题,即使是初学者提出的问题。@SheerFish-1,造成内存泄漏不是好的,你还导致了
    空闲(指针)
    的未定义行为。请记住,在C语言中,变量是通过值传递的。你缺乏C语言的基本知识。我只是想帮助你,如果你不同意,我们可以开始聊天,我会很高兴地解释。@SheerFish再次用printf清楚地显示主指针的代码没有更改。让我们拿起任何一本标准书。整个
    指向指针的指针
    指向变量的指针
    都用图形、数字和基本代码进行了很好的解释。