Назначение делает указатель из целочисленного предупреждения - PullRequest
1 голос
/ 08 января 2012

Заголовок:

#ifndef BIT_H_INCLUDE_GUARD
#define BIT_H_INCLUDE_GUARD

typedef unsigned char byte;

typedef struct{
    size_t* size;
    byte* map;
} bit;

bit* bdcteate(byte* size);

#endif /* BIT_H_INCLUDE_GUARD */

Источник:

#include <stdlib.h>
#include "bit.h"

bit* bdcreate(byte* size){
    bit* d;
    byte i;
    size_t s = 0;
    for(i = 1; i < size[0]; i++){
        s += (size_t) size[i];
    }
    if(!(d = malloc(sizeof(bit)))){
        return (bit*) NULL;
    }
    if(!(d->size = malloc(sizeof(size_t)))){
        return (bit*) NULL;
    }
    if(!(d->map = malloc(s * sizeof(byte)))){
        return (bit*) NULL;
    }
    *d->size = s;
    return (bit*) d;
}

Основной:

#include <stdlib.h>
#include "bit.h"

void main(void){
    byte *b, i;
    byte size = 9;
    b = malloc((size+1) * sizeof(byte));
    b[0] = size;
    for(i = 1; i <= size; i++){
        b[i] = (b[i-1] + 10);
    }   

    bit* dict;
    if(!(dict = bdcreate(b))){ /* warning: assignment makes pointer from integer without a cast */
        exit(EXIT_FAILURE);
    }
    exit(EXIT_SUCCESS);
}

Как вы видите в закомментированной строке, я получаю «предупреждение: присваивание делает указатель из целого числа без приведения», хотя я пытаюсь явно указать, что я возвращаю указатель.

Я компилирую с помощью gcc (gcc -o test main.c bit.c), и программа , кажется, работает нормально.

Должен ли я игнорировать это или он вернется и укусит меня, пока я сплю?

Ответы [ 2 ]

10 голосов
/ 08 января 2012

В вашем заголовке:

bit* bdcteate(byte* size);
        ^ this is a typo

Это означает, что компилятор выведет сигнатуру по умолчанию для bdcreate в вашем main, а сигнатура по умолчанию вернет int.

2 голосов
/ 08 января 2012

В бит.ч опечатка есть.«bdcteate» должен быть «bdcreate».Таким образом, в bit.h отсутствует предварительное объявление для bdcreate, что означает, что компилятор предполагает, что вызов main возвращает int.Код работает в любом случае, потому что в используемом вами процессоре либо int достаточно большой, чтобы содержать указатель, либо обрезанные биты не делают недействительным полученный указатель.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...