malloc... (не пойму...)

Модератор: Модераторы разделов

t3st3r
Сообщения: 9

malloc...

Сообщение t3st3r »

Есть код, где для переменной выделяется память через malloc:
...
float *t;
int i, n;
printf("Enter num of rows: ");
scanf("%d", &n);
t = (float *)malloc(n*sizeof(float));
for(i=0; i<n; i++) {
printf("x[%d] = ", i);
scanf("%f", &t[i]);
}
...

Так вот там где выделил красным можно опустить, так вот мне интересно, это принципиально или нет, нужно ли всегда приводить к типу или нет?
Спасибо сказали:
t3st3r
Сообщения: 9

Re: malloc...

Сообщение t3st3r »

Никто не знает, или вопрос тупой?
Спасибо сказали:
Аватара пользователя
KiWi
Бывший модератор
Сообщения: 2521
Статус: статус, статус, статус

Re: malloc...

Сообщение KiWi »

Вопрос тупой)
Спасибо сказали:
Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu

Re: malloc...

Сообщение serzh-z »

:D

t3st3r

Приведение - это всего лишь навсего подписывание программиста в том, что он не дурак, находится в здравом уме и осознаёт что он делает. Это означает, что данные при приведении никак не изменяются. Отсюда т делаем выводы, "всегда или не всегда" и по какой причине.

Т.е. это просто договор с компилятором, что "вот этот" кусок памяти, выглядящий для компилятора как структура A на самом деле представляет собою со-овсем другую (или просто совместимую) структуру B. Такая, вот, бодяга. :)
Спасибо сказали:
t3st3r
Сообщения: 9

Re: malloc...

Сообщение t3st3r »

serzh-z thx
Спасибо сказали:
Аватара пользователя
mitya
Сообщения: 54

Re: malloc...

Сообщение mitya »

t3st3r писал(а):
23.07.2006 16:04
Есть код, где для переменной выделяется память через malloc:
...
float *t;
int i, n;
printf("Enter num of rows: ");
scanf("%d", &n);
t = (float *)malloc(n*sizeof(float));
for(i=0; i<n; i++) {
printf("x[%d] = ", i);
scanf("%f", &t[i]);
}
...

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


Приводить к типу нужно тогда, когда ты определяешь указатель как

Код: Выделить всё

void * t
, таким образом ты можешь сделать casting на любой тип данных, необходимых тебе в разных ситуациях. В твоём случае он заранее определён, как . По большому счёту, это нужно лишь для определения размера структуры данных, на которую ты указываешь.
Спасибо сказали:
Аватара пользователя
oav
Бывший модератор
Сообщения: 296

Re: malloc...

Сообщение oav »

По большому счёту, это нужно лишь для определения размера структуры данных, на которую ты указываешь.

Чушь. Размер указателя всегда один и тотже для любых типов (в С).
Спасибо сказали:
Аватара пользователя
Alxn1
Сообщения: 402
Статус: Красноглазик со стажем
ОС: Mavericks

Re: malloc...

Сообщение Alxn1 »

oav писал(а):
24.07.2006 16:38

По большому счёту, это нужно лишь для определения размера структуры данных, на которую ты указываешь.

Чушь. Размер указателя всегда один и тотже для любых типов (в С).


Ну, во-первых, речь едёт не о размере указателя, а о размере и, похоже, типе того, на что указываем. Далее, в С размер указателя может иметь различный размер, но это зависит не от того, на что он указывает, а от платформы, модели памяти и того, как далеко расположенно то, на что указывают.
Спасибо сказали:
v04bvs
Сообщения: 636
ОС: Debian GNU/Linux

Re: malloc...

Сообщение v04bvs »

(Standard) писал(а):void *malloc(size_t size);
...
A pointer to void may be converted to or from a pointer to any incomplete or object
type. A pointer to any incomplete or object type may be converted to a pointer to void
and back again; the result shall compare equal to the original pointer.

Поэтому приведение необязательно. Но, мне почему то кажется, что это в последней версии стандарта, в предыдущих надо было приводить самостоятельно. Поэтому подобный код может часто встречаться в старых программах. Впрочем могу ошибаться.
Спасибо сказали:
Аватара пользователя
Liksys
Сообщения: 2910

Re: malloc...

Сообщение Liksys »

Хорошим тоном является явное приведение типов. И не только для компилятора, но и для человека, читающего код. Проще разобраться, что к чему.
Спасибо сказали:
Аватара пользователя
mitya
Сообщения: 54

Re: malloc...

Сообщение mitya »

oav писал(а):
24.07.2006 16:38

По большому счёту, это нужно лишь для определения размера структуры данных, на которую ты указываешь.

Чушь. Размер указателя всегда один и тотже для любых типов (в С).

Чукча не читатель? :)
Спасибо сказали:
Аватара пользователя
oav
Бывший модератор
Сообщения: 296

Re: malloc...

Сообщение oav »

mitya писал(а):
25.07.2006 10:04
oav писал(а):
24.07.2006 16:38


По большому счёту, это нужно лишь для определения размера структуры данных, на которую ты указываешь.

Чушь. Размер указателя всегда один и тотже для любых типов (в С).

Чукча не читатель? :)

Аха, только чушь - По большому счёту, это нужно лишь для определения размера структуры данных. Когда ты присваеваешь результат малока переменной размер "структуры" (??) никаким боком не лежал. Поэтому и чушь.

про разные платформы песни петь не нужно. мы говорим про одну единцу трансляции,, а именно этот кусок кода. Размер указателя здесь один и тотже _всегда_. sizeof(void*)==sizeof(float*)
Спасибо сказали:
Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu

Re: malloc...

Сообщение serzh-z »

Liksys писал(а):
25.07.2006 00:09
Хорошим тоном является явное приведение типов.
Добро пожаловать в весёлый мир рефакторинга. :)
Спасибо сказали:
Аватара пользователя
Liksys
Сообщения: 2910

Re: malloc...

Сообщение Liksys »

serzh-z писал(а):
25.07.2006 11:18
Liksys писал(а):
25.07.2006 00:09

Хорошим тоном является явное приведение типов.
Добро пожаловать в весёлый мир рефакторинга. :)

:) читай posix и др. стандарты
Спасибо сказали:
Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu

Re: malloc...

Сообщение serzh-z »

Liksys писал(а):
25.07.2006 11:20
:) читай posix и др. стандарты
Ну-ну... Очень рекомендую попробовать набор шаблонов *_cast из C++ с упомянутым хорошим тоном. На второй день повесишься.
Спасибо сказали:
Аватара пользователя
mitya
Сообщения: 54

Re: malloc...

Сообщение mitya »

oav писал(а):
25.07.2006 10:44
mitya писал(а):
25.07.2006 10:04

oav писал(а):
24.07.2006 16:38


По большому счёту, это нужно лишь для определения размера структуры данных, на которую ты указываешь.

Чушь. Размер указателя всегда один и тотже для любых типов (в С).

Чукча не читатель? :)

Аха, только чушь - По большому счёту, это нужно лишь для определения размера структуры данных. Когда ты присваеваешь результат малока переменной размер "структуры" (??) никаким боком не лежал. Поэтому и чушь.

про разные платформы песни петь не нужно. мы говорим про одну единцу трансляции,, а именно этот кусок кода. Размер указателя здесь один и тотже _всегда_. sizeof(void*)==sizeof(float*)


Причём здесь размер указателя!? Где я говорил что-то про размер указателя!? malloc выделяет n*sizeof(type) байт в памяти. Приведение void* к type* нужно для того чтобы программист мог ориентироваться в своём или чужом коде и при необходимости написать sizeof(type), зная с каким типом данных он имеет дело. И, пожалуйста, не надо мне больше рассказывать про размеры указателей.
Спасибо сказали:
Аватара пользователя
oav
Бывший модератор
Сообщения: 296

Re: malloc...

Сообщение oav »

mitya писал(а):
25.07.2006 11:39
Причём здесь размер указателя!? Где я говорил что-то про размер указателя!? malloc выделяет n*sizeof(type) байт в памяти. Приведение void* к type* нужно для того чтобы программист мог ориентироваться в своём или чужом коде и при необходимости написать sizeof(type), зная с каким типом данных он имеет дело. И, пожалуйста, не надо мне больше рассказывать про размеры указателей.

уже кипятишься? :)

Приводить к типу нужно тогда, когда ты определяешь указатель как
Код
void * t
, таким образом ты можешь сделать casting на любой тип данных, необходимых тебе в разных ситуациях. В твоём случае он заранее определён, как
Код
float *
. По большому счёту, это нужно лишь для определения размера структуры данных, на которую ты указываешь.

это кто написал? что "кастинг нужен лишь для опеределения размера структуры данных")))) ладно, флейм завязываю, удачи на дорогах
Спасибо сказали:
neuralNetwork
Сообщения: 119
ОС: Debian Squeeze

Re: malloc...

Сообщение neuralNetwork »

mitya писал(а):
25.07.2006 11:39
Приведение void* к type* нужно для того чтобы программист мог ориентироваться в своём или чужом коде и при необходимости написать sizeof(type), зная с каким типом данных он имеет дело.
Если Вы пишете приведение только для этого, тогда лучше будет

Код: Выделить всё

t = malloc(n*sizeof(*t))
поскольку оно инвариантно относительно типа данных.
Спасибо сказали: