C free(): invalid pointer allocated in other function

后端 未结 5 1888
醉梦人生
醉梦人生 2020-12-07 06:37

I\'m new in StackOverflow. I\'m learning C pointer now.

This is my code:

#include 
#include 

int alloc(int* p){
    p         


        
5条回答
  •  自闭症患者
    2020-12-07 07:04

    You have two major problems in your code.

    First, the alloc function creates a pointer via malloc, but never frees it, nor does it return the pointer to the calling function. This guarantees the memory the pointer addresses can never be freed up via the free command, and you now have memory leaks.

    Second, the variable, int* pointer in main, is not being modified as you would think. In C, function arguments are "passed by value". You have two ways to address this problem:

    1. Pass a pointer to the variable you want to modify (in your case, a pointer to a pointer to an int)
    2. Have the function return the pointer to the function that called it.

    Here are two implementations of my recommendations:

    Approach 1


    #include 
    #include 
    
    int alloc(int** p);
    
    int alloc(int** p) {
       if (!p) {
          printf("Invalid argument\n");
          return (-1);
       }
       if ((*p = (int*)malloc(sizeof(int))) == NULL) {
          printf("Memory allocation error\n");
          return (-1);
       }
       **p = 123;
       printf("p:%p - *p:%p - **p:%d\n", p, *p, **p);
       return 0;
    }
    
    int main(){
       int* pointer;
    
       if(alloc(&pointer) != 0){
          printf("Error calling function\n");
       }else{
          printf("&pointer:%p- pointer:%p- *pointer:%d\n", &pointer, pointer, *pointer);
       }
    
       free(pointer);
    
       return 0;
    }
    

    Sample Run for Approach 1


    p:0xbfbea07c - *p:0x8656008 - **p:123
    &pointer:0xbfbea07cointer - pointer:0x8656008ointer - *pointer:123
    

    Approach 2


    #include 
    #include 
    
    int* alloc(void) {
       int* p;
       if ((p = (int*)malloc(sizeof(int))) == NULL) {
          printf("Memory allocation error\n");
          return (NULL);
       }
       *p = 123;
       printf("p:%p - *p:%d\n", p, *p);
       return p;
    }
    
    int main(){
       int* pointer = alloc();
    
       if(pointer == NULL) {
          printf("Error calling function\n");
       }else{
          printf("&pointer:%p- pointer:%p- *pointer:%d\n", &pointer, pointer, *pointer);
       }
    
       free(pointer);
       pointer = NULL;
    
       return 0;
    }
    

    Sample Run for Approach 2


    p:0x858e008 - *p:123
    &pointer:0xbf9bb1ac- pointer:0x858e008- *pointer:123
    

提交回复
热议问题