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);
您会选择哪个以及为什么?
答案 0 :(得分:3)
两者都不可能。
不要为malloc
设置存根函数,因为您的代码对于阅读代码的人来说变得不那么清晰了。 (malloc
是一个标准函数,每个人都知道它的作用。)
并且不要在malloc
的右侧施放=
:这是一种糟糕的编程风格,因为(i)你在重复自己和(ii)有人重构你的代码可能会改变一个而不是另一个地方的指针类型。这可能会引入未定义的行为。
答案 1 :(得分:2)
要回答此问题, TL; DR ,任何一个问题。两者都可以。
要挑剔,没有,因为
这两种方法都没有错误检查。那么包装器的用途是什么?
1.1。如果我将string_size
作为-ve值传递,malloc()
将会爆炸。
1.2。在使用返回的指针之前,应检查malloc()
失败(或成功)。
malloc()
C
和gitrepo/.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,嵌入式等等,您没有调试器,简单的练习会省去很多头痛!