nixp.ru v3.0

28 мая 2017,
воскресенье,
11:46:23 MSK

DevOps с компанией «Флант»
t3st3r написал 24 июля 2006 года в 08:01 (301 просмотр) Ведет себя неопределенно; открыл 11 тем в форуме, оставил 14 комментариев на сайте.

Есть код, где для переменной выделяется память через malloc:

float *t;

int i, n;

printf(«Enter num of rows: »);

scanf(«%d», &n);

t = (float *)malloc(n*sizeof(float));

for(i=0; i

printf(«x[%d] = », i);

scanf(«%f», &t);

}

Так вот, (float *) можно опустить, и мне интересно, это принципиально или нет, нужно ли всегда приводить к типу или нет?

iliya

По поводу можно или нельзя, если компилятор ругается то нельзя, если нет то можно (честно говоря не помню ,как на это смотрит gcc).

В принципе они все void*, поэтому разницы быть не должно, вот если бы умный компилятор выбирал специфический malloc для разных типов данных, то может быть плюс бы и был (в виде правильного смещения), но это сомнительно.

Feuerbach

Признаком хорошего тона является как раз не приводить.

Если компилятор ругается — это верный признак того, что ты не подключил нужный header, где написано, что malloc возвращает void *. Приводить типы в данном случае — прятать голову в песок.

Если же все подключено, то можно и привести — проблем не будет, конечно, но вот программист, читающий твой код, насторожится — а зачем это тебе понадобилось обманывать компилятор?

myst

В С лучше не приводить, потому что void * автоматически приводится к type * и наоборот. А вот в С++ приводить надо, ибо проверка типов более жёсткая. Хотя в С++ лучше использовать new.

t3st3r

Feuerbach, myst, iliya, Большое спасибо, наконец-то понятно объяснили! THX.