Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.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
带calloc的宏是否安全?_C_Dynamic Allocation - Fatal编程技术网

带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
      • 固定大小的字体
      • 删除冗余和不可移植的

      请注意,在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中查找结果,从而导致问题!)请注意,在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:很抱歉缺少
      -已编辑答案以立即包含此内容。