3

假设这个程序:

#include <stdio.h>
#include <string.h>

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**) (或只是禁用兼容性检查)?因为我非常想保留有关间接级别的兼容性警告......

4

3 回答 3

3

为什么不更改方法签名,使其返回新指针而不是通过指针传递它?事实上,就像常规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;   
}
于 2010-05-31T14:05:06.833 回答
2

更改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 *与其他指针类型的转换是自动应用的。

于 2010-05-31T13:58:06.457 回答
1

简单地改变:

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

至:

static void ring_pool_alloc(char **p, size_t n) {
于 2010-05-31T13:57:58.673 回答