Избегайте несовместимого предупреждения указателя при работе с двойной косвенностью - PullRequest
3 голосов
/ 31 мая 2010

Предполагается, что эта программа:

#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 **) (или просто отключения проверки совместимости)? Потому что я очень хотел бы сохранить предупреждения о совместимости относительно уровня косвенности ...

Ответы [ 3 ]

3 голосов
/ 31 мая 2010

Почему бы вам не изменить сигнатуру метода так, чтобы она возвращала новый указатель вместо передачи его по указателю? На самом деле, так же, как обычный 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;   
}
2 голосов
/ 31 мая 2010

Измените 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 * с другими типами указателей применяются автоматически.

1 голос
/ 31 мая 2010

Просто измените:

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

на:

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