Рассмотрим следующий небольшой пример кода:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int *i;
char *c1, *c2;
i = malloc(4);
*i = 65535;
c1 = i;
c2 = (char *)i;
printf("%p %p %p\n", i, c1, c2);
printf("%d %d", *c1, *c2);
free(i);
return 0;
}
В этом примере я выделяю память для хранения целого числа, на которое указывает i
. Затем я сохраняю значение 65535 (1111 1111 1111 1111) в *i
. Следующее, что я делаю, это сделать два указателя char *, также указывая на целое число. Я делаю это два раза, но двумя разными способами: c1 = i;
и c2 = (char *)i;
. Наконец, я печатаю все указатели и все значения на экране. Три указателя указывают на один и тот же адрес, и два значения *c1
и *c2
являются правильными (- 1).
Однако компилятор генерирует предупреждение в этой строке: c1 = i;
. Предупреждение генерируется, потому что я не использовал приведение (char *)
для выполнения задания.
То, что я хотел бы задать, - почему, компилятор генерирует это предупреждение, так как я не вижу любую разницу при использовании c1 = i
; или c2 = (char *)i;
. В обоих случаях результатом является тот же адрес с одинаковым размером в байтах. И это справедливо для всех бросков, даже если это (int *)
cast, (float *)
cast, (short *)
cast и т.д. Все они генерируют одно и то же значение, но компилятор принимает его только без предупреждения, если Используемый тип используется для типа указателя.
Мне действительно хотелось бы знать, почему компилятор запрашивает этот приведение, даже если результат всегда один и тот же.