2012-01-07 7 views
1

Заголовок:Назначение делает указатель из целочисленного предупреждения

#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), и программа кажется для запуска ОК.

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

+1

Обязательно обратите внимание на все предупреждения, включая предупреждения о неявной декларации. –

+1

Кроме того, у вас будет утечка памяти, если произойдет сбой 2-го или 3-го malloc. – Mysticial

+0

yup, я знаю про утечки памяти, но я думал, что этого фрагмента кода уже достаточно! – Psyclops

ответ

10

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

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

Это означает, что компилятор будет считать подпись по умолчанию для bdcreate в вашей основной, и подпись по умолчанию возвращает int.

+2

+1 Глаз Ястреба! –

+0

whoooow !!!! ;) Я проголосую за вас +10000 Cheers !!!! – Psyclops

+0

@Psyclops, я думаю, вы могли бы заработать репутацию 10k, а затем поставить 10k щедрость на этот вопрос, а затем принять ответ :) –

2

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

 Смежные вопросы

  • Нет связанных вопросов^_^