【问题标题】:#define ALLOC(p,n) (p*)malloc(sizeof(p)*n))#define ALLOC(p,n) (p*)malloc(sizeof(p)*n))
【发布时间】:2015-07-13 12:40:15
【问题描述】:

我正在尝试使用 MACROS 分配一些内存。但我得到这个错误:

错误:')' 标记之前的预期表达式

错误:')' 标记之前的预期语句

这是我的代码:

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

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

【问题讨论】:

标签: c compiler-errors macros c-preprocessor


【解决方案1】:

变化:

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

到:

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

并且在main()之前释放分配的内存return

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

【讨论】:

  • #define ALLOC(p,n) malloc(sizeof(*(p))* (n) ) 重要的是把 every 宏参数放在括号中,总是!想象一下,如果将它与非常常见的表达式一起使用会发生什么:ponteiro = ALLOC(ponteiro, 1+strlen(foo));。您的宏将扩展为:malloc(sizeof(*(ponteiro))*1+strlen(foo)),这显然是一个BUG
【解决方案2】:

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

 ponteiro=ALLOC(char, 5);

以这种方式修复宏:

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

【讨论】:

    【解决方案3】:

    改变

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

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

    因为

    1. returnmalloc() need not to be casted
    2. n 代表元素个数,p 是指针,所以 MACRO 定义应该改变。
    3. sizeof(p) 是错误的,因为 p 应该是指针变量名本身。你需要有sizeof(*p)

    也就是说,

    • main()的推荐签名是int main(void)
    • 您应该在使用完成后free()分配的内存。

    【讨论】:

    • 请添加一些括号。
    • 使用这个:#define ALLOC(n, p) malloc(sizeof (*(p)) * (n)) 来防止奇怪的行为。
    • @DavidFerreira 不要以使现有答案无效的方式更改您的代码。它已经为我赢得了一票。 :-)
    • 好的,更新...两个反对票,现在我真的很感兴趣.....我(似乎是唯一的人)在这里遗漏的明显错误是什么...任何人,请帮忙?
    • @SouravGhosh 不,这不好。请包括我写的所有括号。例如,如果您编写 ALLOC(a + b, p),您的代码会生成 malloc(sizeof(*p) * a + b),由于运算符优先级,这是不正确的。
    猜你喜欢
    • 2021-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-18
    • 2020-07-31
    • 2015-06-26
    • 1970-01-01
    • 2013-01-31
    相关资源
    最近更新 更多