处理双重间接时避免不兼容的指针警告
假设这个程序:
#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) {