предупреждение: приведение к указателю из целого числа разного размера [-Wint-to-pointer-cast]

Я изучал C по книге Дэвида Хаскинса "C в Linux", но есть проблема. Когда я пытаюсь скомпилировать этот код:

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

int main (int argc, char *argv[], char *env[]) {

    printf("Content-type:text/html\n\n<html><body bgcolor=#23abe2>\n"); 
    char value[256] = "";

    strncpy(value,(char *) getenv("QUERY_STRING"), 255);
    printf("QUERY_STRING:%s<BR>\n", value );
    printf("<form>\n");
    printf("<input type=\"TEXT\" name=\"ITEM1\"> \n");
    printf("<input type=\"TEXT\" name=\"ITEM2\"> \n");
    printf("<input type=\"SUBMIT\">");
    printf("</form></body></html>\n");

    return 0; 
}

Терминал показывает это предупреждение!

chapter4_1.c: In function ‘main’:
chapter4_1.c:14:16: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]

person user2680683    schedule 14.08.2013    source источник


Ответы (1)


Вы забыли #include <stdlib.h>. Это означает, что getenv() нигде не объявлено, поэтому предполагается, что по умолчанию возвращается int, которое вы приводите к char *. На 64-битной машине int (32 бита) и char * (64 бита) имеют разные размеры, отсюда и предупреждение.

Кроме того, приведение к char * не обязательно, так как getenv() уже возвращает char *. Приведение служит только для маскировки ошибок (т. е. без него программа выдала бы вам четкое сообщение об ошибке о передаче int в char *).

person 1''    schedule 14.08.2013
comment
+1 за замечания о скрытых ошибках приведения. В общем, броски неправильные. Есть несколько исключений из этого правила, но если вы действительно не понимаете причину присутствия приведения, скорее всего, оно маскирует ошибку. - person R.. GitHub STOP HELPING ICE; 14.08.2013