#定义ALLOC(p,n)(p*)malloc(sizeof(p)*n))

#定义ALLOC(p,n)(p*)malloc(sizeof(p)*n)),c,compiler-errors,macros,c-preprocessor,C,Compiler Errors,Macros,C Preprocessor,我正在尝试使用宏分配一些内存。但我有这样的错误: 错误:在“')标记之前应该有表达式 错误:在“')标记之前应该有语句 这是我的代码: #define ALLOC(p,n) (p*)malloc(sizeof(p)*n) int main(){ char *ponteiro; ponteiro=ALLOC(5,ponteiro); return 0; } 改变 到 因为 malloc()的返回 n表示元素的数量,而p是指针,因此宏定义应该更改 sizeof(p)是错误的,因为p应

我正在尝试使用宏分配一些内存。但我有这样的错误:

错误:在“')标记之前应该有表达式

错误:在“')标记之前应该有语句

这是我的代码:

#define ALLOC(p,n) (p*)malloc(sizeof(p)*n)

int main(){
  char *ponteiro;
  ponteiro=ALLOC(5,ponteiro);
  return 0;
}
改变

因为

  • malloc()
    返回
  • n
    表示元素的数量,而
    p
    是指针,因此宏定义应该更改
  • sizeof(p)
    是错误的,因为
    p
    应该是指针变量名本身。您需要有
    sizeof(*p)
  • 也就是说

    • main()
      的建议签名是
      int main(void)
    • 使用完毕后,您应该
      free()
      分配的内存
    更改:

    #define ALLOC(p,n) (p*)malloc(sizeof(p)*n)
    
    致:

    main()中释放分配的内存,然后返回

    int main(){
        char *ponteiro;
        ponteiro = ALLOC(ponteiro,5);
        /* Do something */
        free(ponteiro);
        return 0;
    }
    

    宏需要一些额外的括号,您犯了一个错误:必须将类型传递给宏:

     ponteiro=ALLOC(char, 5);
    
    按以下方式修复宏:

     #define ALLOC(p,n)  ((p*)malloc(sizeof(p)*(n)))
    

    计算宏定义中的括号。请在
    C
    中输入
    malloc()
    和family的返回值。请添加一些括号。使用以下命令:
    #定义ALLOC(n,p)malloc(sizeof(*(p))*(n))
    ,以防止出现奇怪的行为。@DavidFerreira不会以使现有答案无效的方式更改代码。这已经为我赢得了一票否决票。:-)好的,更新…两张反对票,现在我真的很感兴趣。。。。。我(似乎是唯一一个人)在这里遗漏的那个明显的错误是什么……任何人,请帮帮我?@SouravGhosh不,不好。请包括我写的所有括号。例如,如果您编写
    ALLOC(a+b,p)
    ,您的代码将生成
    malloc(sizeof(*p)*a+b)
    ,这是不正确的,因为运算符优先级不正确。
    #定义ALLOC(p,n)malloc(sizeof(*(p))*(n))
    对于将每个宏参数放在括号中始终很重要!想象一下,如果将它与非常常见的表达式一起使用,会发生什么:
    ponteiro=ALLOC(ponteiro,1+strlen(foo))。您的宏将扩展为:
    malloc(sizeof(*(ponteiro))*1+strlen(foo))
    ,这显然是一个BUG。
    int main(){
        char *ponteiro;
        ponteiro = ALLOC(ponteiro,5);
        /* Do something */
        free(ponteiro);
        return 0;
    }
    
     ponteiro=ALLOC(char, 5);
    
     #define ALLOC(p,n)  ((p*)malloc(sizeof(p)*(n)))