Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.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内存到函数中的char*。返回*字符或传递字符**作为函数参数?_C_Malloc - Fatal编程技术网

Malloc内存到函数中的char*。返回*字符或传递字符**作为函数参数?

Malloc内存到函数中的char*。返回*字符或传递字符**作为函数参数?,c,malloc,C,Malloc,方法1: char *a = NULL; char *b = NULL; char *malloc_string(int string_size){ return (char*)malloc(string_size); } a=malloc_string(4); free(a); 方法2: char *a = NULL; char *b = NULL; char *malloc_string(int string_size){ return (char*)malloc(

方法1:

char *a = NULL;
char *b = NULL;
char *malloc_string(int string_size){
    return (char*)malloc(string_size);
}

a=malloc_string(4);

free(a);
方法2:

char *a = NULL;
char *b = NULL;
char *malloc_string(int string_size){
    return (char*)malloc(string_size);
}

a=malloc_string(4);

free(a);
你会选择哪个?为什么?

要回答这个问题,TL;DR,任何人。两个都可以

吹毛求疵,没有,因为

  • 这两种方法都缺少错误检查。那么包装纸有什么用呢

    1.1。如果我将
    string\u size
    作为-ve值传递,则
    malloc()
    将爆炸

    1.2<在使用返回的指针之前,应检查代码>malloc()失败(或成功)

  • 请在
    C
    中输入
    malloc()
    和family的返回值
  • 要回答这个问题,TL;DR,任何人。两个都可以

    吹毛求疵,没有,因为

  • 这两种方法都缺少错误检查。那么包装纸有什么用呢

    1.1。如果我将
    string\u size
    作为-ve值传递,则
    malloc()
    将爆炸

    1.2<在使用返回的指针之前,应检查代码>malloc()失败(或成功)

  • 请在
    C
    中输入
    malloc()
    和family的返回值

  • 两者都不好:都很糟糕

  • 不要为
    malloc
    设置存根函数,因为人们阅读代码时,代码变得不那么清晰。(
    malloc
    是一个标准函数,每个人都知道它的功能。)

  • 而且不要在
    =
    的右侧使用
    malloc
    :这是一种糟糕的编程风格,因为(i)你在重复你自己,(ii)有人重构你的代码可能会在一个地方而不是在另一个地方更改指针类型。这可能会引入未定义的行为


  • 两者都不好:都很糟糕

  • 不要为
    malloc
    设置存根函数,因为人们阅读代码时,代码变得不那么清晰。(
    malloc
    是一个标准函数,每个人都知道它的功能。)

  • 而且不要在
    =
    的右侧使用
    malloc
    :这是一种糟糕的编程风格,因为(i)你在重复你自己,(ii)有人重构你的代码可能会在一个地方而不是在另一个地方更改指针类型。这可能会引入未定义的行为


  • 在C语言中正确的方法是不要首先定义
    malloc_string()
    ,它只是引入了一个不必要的函数调用(希望是经过优化的)。只要这样做:

    void malloc_string(char **a, int string_size){
        *a = (char*)malloc(string_size);
    }
    
    malloc_string(&b, 4);
    
    free(b);
    
    另见

    除此之外,您的参数类型是错误的,它必须是
    size\u t
    ,而不是
    int
    (您的编译器应该对此发出警告,启用编译器警告)

    最后,您可能应该在
    malloc
    周围定义一个包装器,以便在中心位置处理错误。。。在最简单的形式中,它将如下所示:

    a = malloc(4);
    
    #define SAFE_FREE(m)    \
    {                       \
       if(m)                \
       {                    \
          free(m);          \
          m = NULL;         \
       }                    \
    }
    

    在C语言中正确的方法是不要首先定义
    malloc_string()
    ,它只是引入了一个不必要的函数调用(希望是经过优化的)。只要这样做:

    void malloc_string(char **a, int string_size){
        *a = (char*)malloc(string_size);
    }
    
    malloc_string(&b, 4);
    
    free(b);
    
    另见

    除此之外,您的参数类型是错误的,它必须是
    size\u t
    ,而不是
    int
    (您的编译器应该对此发出警告,启用编译器警告)

    最后,您可能应该在
    malloc
    周围定义一个包装器,以便在中心位置处理错误。。。在最简单的形式中,它将如下所示:

    a = malloc(4);
    
    #define SAFE_FREE(m)    \
    {                       \
       if(m)                \
       {                    \
          free(m);          \
          m = NULL;         \
       }                    \
    }
    

    唯一值得替换的是free(),C标准没有说释放内存后指针必须为空

    void *xmalloc(size_t size)
    {
        void *ret;
        if (!(ret = malloc(size))
        {
            /* perror("malloc"); */
            exit(1);
        }
        return ret;
    }
    
    一个好的做法是将释放的指针设为NULL,如果您习惯于对每个内部函数使用assert,这将有助于在早期发现潜在问题,如下所示:

    a = malloc(4);
    
    #define SAFE_FREE(m)    \
    {                       \
       if(m)                \
       {                    \
          free(m);          \
          m = NULL;         \
       }                    \
    }
    
    如果在释放指针并调用func后不将其置空,则在大多数编译器和平台上永远不会触发断言(内存分配是特定于平台的)


    如果您有IDE调试器并且可以单步执行代码,那么这似乎不是什么大问题,但在某些情况下,例如UEFI、embedded等。如果您没有调试器,那么简单的实践将省去很多麻烦

    唯一值得替换的是free(),C标准没有说释放内存后指针必须为空

    void *xmalloc(size_t size)
    {
        void *ret;
        if (!(ret = malloc(size))
        {
            /* perror("malloc"); */
            exit(1);
        }
        return ret;
    }
    
    一个好的做法是将释放的指针设为NULL,如果您习惯于对每个内部函数使用assert,这将有助于在早期发现潜在问题,如下所示:

    a = malloc(4);
    
    #define SAFE_FREE(m)    \
    {                       \
       if(m)                \
       {                    \
          free(m);          \
          m = NULL;         \
       }                    \
    }
    
    如果在释放指针并调用func后不将其置空,则在大多数编译器和平台上永远不会触发断言(内存分配是特定于平台的)


    如果您有IDE调试器并且可以单步执行代码,那么这似乎不是什么大问题,但在某些情况下,例如UEFI、embedded等。如果您没有调试器,那么简单的实践将省去很多麻烦

    这取决于你。这两种方法都是正确的。顺便说一句,不要在C中强制转换malloc的返回值,因此实际上第一种方法是无用的,只需使用
    a=malloc(4)
    而不是
    a=malloc\u string(4)
    方法2中使用模式的一个常见原因是函数返回错误代码,而不是
    void
    。这取决于您。这两种方法都是正确的。顺便说一句,不要在C中强制转换malloc的返回值,所以实际上第一种方法是无用的,只需使用
    a=malloc(4)
    而不是
    a=malloc\u string(4)
    方法2中使用模式的一个常见原因是函数返回错误代码,而不是
    void
    ,可调用函数中的malloc不好?你的意思是要先对指针进行malloc,然后将指针传递给函数?不,没关系。但我决不会为了它而存根
    malloc
    。只是不要忘记返回的指针。那么,可调用函数中的malloc是坏的?你的意思是要先对指针进行malloc,然后将指针传递给函数?不,没关系。但我永远不会存根
    malloc
    fo