处理双重间接时避免不兼容的指针警告

假设这个程序:

#include  #include  static void ring_pool_alloc(void **p, size_t n) { static unsigned char pool[256], i = 0; *p = &pool[i]; i += n; } int main(void) { char *str; ring_pool_alloc(&str, 7); strcpy(str, "foobar"); printf("%s\n", str); return 0; } 

……有可能以某种方式避免GCC警告

 test.c:12: warning: passing argument 1 of 'ring_pool_alloc' from incompatible pointer type test.c:4: note: expected 'void **' but argument is of type 'char **' 

…没有转换为(void **)(或者只是禁用兼容性检查)? 因为我非常想保留关于间接级别的兼容性警告……

为什么不更改方法签名,使其返回新指针而不是通过指针传递? 事实上,就像普通的malloc一样:

 static void * ring_pool_alloc(size_t n) { static unsigned char pool[256], i = 0; void *p = &pool[i]; i += n; return p; } int main(void) { char *str = ring_pool_alloc(7); strcpy(str, "foobar"); printf("%s\n", str); return 0; } 

更改ring_pool_alloc以接收void * 。 如果您愿意,您可以在函数中重新设置为void **

或者在您的具体情况中:

 /* You can pass any pointer as a first parameter */ static void ring_pool_alloc(void *r, size_t n) { unsigned char **p = r; /* no cast necessary */ static unsigned char pool[256], i = 0; *p = &pool[i]; i += n; } 

请注意, void **不能作为通用指针到指针类型。 另一方面,自动应用与其他指针类型的void *转换为void *

简单地改变:

 static void ring_pool_alloc(void **p, size_t n) { 

至:

 static void ring_pool_alloc(char **p, size_t n) {