#定义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)))