带calloc的宏是否安全?
在代码中使用此宏是否安全带calloc的宏是否安全?,c,dynamic-allocation,C,Dynamic Allocation,在代码中使用此宏是否安全 #define my_calloc(x, n) ((x) = (__typeof__ (x))calloc((n), sizeof(__typeof__ (&(x))))) 我使用gcc作为编译器 在我的程序中有很多内存分配点,所以我使用这个。 我5分钟前试过了,我得到了一些奇怪的信号,现在我要回家了。。。之后,如果我能找到什么,我会再试一次 一些想法/提示 编辑添加: 通常,我使用宏如下所示: double *x; my_calloc(x, 10); in
#define my_calloc(x, n) ((x) = (__typeof__ (x))calloc((n), sizeof(__typeof__ (&(x)))))
我使用gcc作为编译器
在我的程序中有很多内存分配点,所以我使用这个。
我5分钟前试过了,我得到了一些奇怪的信号,现在我要回家了。。。之后,如果我能找到什么,我会再试一次
一些想法/提示
编辑添加:
通常,我使用宏如下所示:
double *x;
my_calloc(x, 10);
int **y;
my_calloc(y, 30);
宏分配的是
n
指针而不是对象。尝试sizeof(*(x))
您的宏分配的是n
指针而不是对象。试试sizeof(*(x))
我想它应该是:
#define my_calloc(x, n) do { (x) = calloc((n), sizeof *(x)); } while (0)
- 已移除不必要/危险的铸件
- 删除多余的括号
- 添加do/while可在
和if(…)
else
- 固定大小的字体
- 删除冗余和不可移植的
- 我认为可能是:
#define my_calloc(x, n) do { (x) = calloc((n), sizeof *(x)); } while (0)
- 已移除不必要/危险的铸件
- 删除多余的括号
- 添加do/while可在
和if(…)
else
- 固定大小的字体
- 删除冗余和不可移植的
malloc()
。@Jonathan:您可能是对的-当原型是强制性的,我想不出有什么危险的场景。即使我们可以假设C99,我也不喜欢看到不必要的类型强制转换——这是一种“代码气味”。C99不强制要求原型:int main(void){return abs(0);}
是一个严格一致的程序。@pmg:您依赖于abs()
的隐式声明作为返回int
的函数,这在严格的C99中是不允许的。使用extern int abs()就可以了代码>-函数的非原型声明。更相关的是,“int main(void){return malloc(10)!=0;}
”并不是严格一致的(因为malloc()
不是一个返回int
的函数;在M680x0芯片上,malloc()的返回值)
应该在寄存器A0中,但由于编译器被欺骗,它会在寄存器D0中查找结果,从而导致问题!)请注意,在C中强制转换malloc/calloc的结果是不必要的,而且有潜在危险的。@Paul R:如果在C99中编译,其中必须声明malloc()
在使用前是否在范围内?@Jonathan:你可能是对的-当原型是强制性的时,我想不出有什么危险的情况。即使我们可以假设C99,我也不喜欢看到不必要的类型强制转换——这是一种“代码气味”。C99不强制要求原型:int main(void){return abs(0);}
是一个严格一致的程序。@pmg:您依赖于abs()
的隐式声明作为返回int
的函数,这在严格的C99中是不允许的。使用extern int abs()就可以了代码>-函数的非原型声明。更相关的是,“int main(void){return malloc(10)!=0;}
”并不是严格一致的(因为malloc()
不是一个返回int
的函数;在M680x0芯片上,malloc()的返回值)
应该在寄存器A0中,但由于编译器被欺骗,它会在寄存器D0中查找结果,从而导致问题!)+1,但是您删除了参数(x)
和(n)
周围必要的括号,并将无用的括号保留在sizeof
之后。。。它应该读为#define my_calloc(x,n)do{(x)=calloc((n),sizeof*(x))}而(0)
@R。谢谢-我的一个习惯是(可能是坏的)总是在sizeof
后面加括号,可能是因为我永远记不起何时需要和何时不需要括号的规则@R.x
为什么需要括号?当然,它只能是变量名?它们仅用于分组,或者如果您将sizeof
应用于带括号的类型名而不是表达式,则需要使用它们。@the_candyman:很抱歉缺少代码>-现在编辑答案以包含此内容。+1,但您删除了参数(x)
和(n)
周围必要的括号,并将无用的括号保留在sizeof
之后。。。它应该读为#define my_calloc(x,n)do{(x)=calloc((n),sizeof*(x))}而(0)
@R。谢谢-我的一个习惯是(可能是坏的)总是在sizeof
后面加括号,可能是因为我永远记不起何时需要和何时不需要括号的规则@R.x
为什么需要括号?当然,它只能是变量名?它们仅用于分组,或者如果您将sizeof
应用于带括号的类型名而不是表达式,则需要使用它们。@the_candyman:很抱歉缺少代码>-已编辑答案以立即包含此内容。