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**) にキャストせずに (または単に互換性チェックを無効にして)? indirection-level に関する互換性警告を維持したいので...

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 に答える