malloc内存到char *的功能。返回* char或传递char **作为函数参数?

时间:2015-07-22 11:44:48

标签: c malloc

char *a = NULL;
char *b = NULL;

方法1:

char *malloc_string(int string_size){
    return (char*)malloc(string_size);
}

a=malloc_string(4);

free(a);

方法2:

void malloc_string(char **a, int string_size){
    *a = (char*)malloc(string_size);
}

malloc_string(&b, 4);

free(b);

您会选择哪个以及为什么?

4 个答案:

答案 0 :(得分:3)

两者都不可能。

  1. 不要为malloc设置存根函数,因为您的代码对于阅读代码的人来说变得不那么清晰了。 (malloc是一个标准函数,每个人都知道它的作用。)

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

答案 1 :(得分:2)

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

要挑剔,没有,因为

  1. 这两种方法都没有错误检查。那么包装器的用途是什么?

    1.1。如果我将string_size作为-ve值传递,malloc()将会爆炸。

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

  2. malloc() Cgitrepo/.git/hooks/commit-msg 家人的回复价值see why not to cast

答案 2 :(得分:2)

C中的正确方法是永远不要首先定义malloc_string(),它只是引入了一个不必要的(并且希望优化掉)函数调用。就这样做:

a = malloc(4);

另见Do I cast the result of malloc?

除此之外,你的参数类型是错误的,它必须是size_t,而不是int(你的编译器应该警告你,启用编译器警告)

最后,你应该在malloc周围定义一个单个包装来处理中心位置的错误...以最简单的形式,它看起来像这样:

void *xmalloc(size_t size)
{
    void *ret;
    if (!(ret = malloc(size))
    {
        /* perror("malloc"); */
        exit(1);
    }
    return ret;
}

答案 3 :(得分:0)

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

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

一个好的做法是对释放的指针进行NULL操作,如果您有习惯为每个内部函数使用assert,这将有助于早期捕获潜在的问题,如下所示:

void foo_internal(void* p)
{
   assert(p != NULL);

   // ...
}

如果在释放指针后没有将NULL指针为NULL并调用func,则绝不会在大多数编译器和平台上触发断言(内存分配是特定于平台的)。

如果您有IDE调试器并且可以单步调试代码,那可能看起来不是什么大问题,但在某些情况下,如UEFI,嵌入式等等,您没有调试器,简单的练习会省去很多头痛!