malloc... (не пойму...)
Модератор: Модераторы разделов
-
t3st3r
- Сообщения: 9
malloc...
Есть код, где для переменной выделяется память через 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]);
}
...
Так вот там где выделил красным можно опустить, так вот мне интересно, это принципиально или нет, нужно ли всегда приводить к типу или нет?
...
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]);
}
...
Так вот там где выделил красным можно опустить, так вот мне интересно, это принципиально или нет, нужно ли всегда приводить к типу или нет?
-
KiWi
- Бывший модератор
- Сообщения: 2521
- Статус: статус, статус, статус
Re: malloc...
Вопрос тупой)
-
serzh-z
- Бывший модератор
- Сообщения: 8259
- Статус: Маньяк
- ОС: Arch, Fedora, Ubuntu
Re: malloc...
t3st3r
Приведение - это всего лишь навсего подписывание программиста в том, что он не дурак, находится в здравом уме и осознаёт что он делает. Это означает, что данные при приведении никак не изменяются. Отсюда т делаем выводы, "всегда или не всегда" и по какой причине.
Т.е. это просто договор с компилятором, что "вот этот" кусок памяти, выглядящий для компилятора как структура A на самом деле представляет собою со-овсем другую (или просто совместимую) структуру B. Такая, вот, бодяга.
-
mitya
- Сообщения: 54
Re: malloc...
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Код: Выделить всё
float *-
oav
- Бывший модератор
- Сообщения: 296
Re: malloc...
По большому счёту, это нужно лишь для определения размера структуры данных, на которую ты указываешь.
Чушь. Размер указателя всегда один и тотже для любых типов (в С).
-
Alxn1
- Сообщения: 402
- Статус: Красноглазик со стажем
- ОС: Mavericks
Re: malloc...
Ну, во-первых, речь едёт не о размере указателя, а о размере и, похоже, типе того, на что указываем. Далее, в С размер указателя может иметь различный размер, но это зависит не от того, на что он указывает, а от платформы, модели памяти и того, как далеко расположенно то, на что указывают.
-
v04bvs
- Сообщения: 636
- ОС: Debian GNU/Linux
Re: malloc...
(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...
Хорошим тоном является явное приведение типов. И не только для компилятора, но и для человека, читающего код. Проще разобраться, что к чему.
-
mitya
- Сообщения: 54
-
oav
- Бывший модератор
- Сообщения: 296
Re: malloc...
Аха, только чушь - По большому счёту, это нужно лишь для определения размера структуры данных. Когда ты присваеваешь результат малока переменной размер "структуры" (??) никаким боком не лежал. Поэтому и чушь.
про разные платформы песни петь не нужно. мы говорим про одну единцу трансляции,, а именно этот кусок кода. Размер указателя здесь один и тотже _всегда_. sizeof(void*)==sizeof(float*)
-
serzh-z
- Бывший модератор
- Сообщения: 8259
- Статус: Маньяк
- ОС: Arch, Fedora, Ubuntu
-
Liksys
- Сообщения: 2910
-
serzh-z
- Бывший модератор
- Сообщения: 8259
- Статус: Маньяк
- ОС: Arch, Fedora, Ubuntu
-
mitya
- Сообщения: 54
Re: malloc...
oav писал(а): ↑25.07.2006 10:44
Аха, только чушь - По большому счёту, это нужно лишь для определения размера структуры данных. Когда ты присваеваешь результат малока переменной размер "структуры" (??) никаким боком не лежал. Поэтому и чушь.
про разные платформы песни петь не нужно. мы говорим про одну единцу трансляции,, а именно этот кусок кода. Размер указателя здесь один и тотже _всегда_. sizeof(void*)==sizeof(float*)
Причём здесь размер указателя!? Где я говорил что-то про размер указателя!? malloc выделяет n*sizeof(type) байт в памяти. Приведение void* к type* нужно для того чтобы программист мог ориентироваться в своём или чужом коде и при необходимости написать sizeof(type), зная с каким типом данных он имеет дело. И, пожалуйста, не надо мне больше рассказывать про размеры указателей.
-
oav
- Бывший модератор
- Сообщения: 296
Re: malloc...
mitya писал(а): ↑25.07.2006 11:39Причём здесь размер указателя!? Где я говорил что-то про размер указателя!? malloc выделяет n*sizeof(type) байт в памяти. Приведение void* к type* нужно для того чтобы программист мог ориентироваться в своём или чужом коде и при необходимости написать sizeof(type), зная с каким типом данных он имеет дело. И, пожалуйста, не надо мне больше рассказывать про размеры указателей.
уже кипятишься?
Приводить к типу нужно тогда, когда ты определяешь указатель как
Код
void * t
, таким образом ты можешь сделать casting на любой тип данных, необходимых тебе в разных ситуациях. В твоём случае он заранее определён, как
Код
float *
. По большому счёту, это нужно лишь для определения размера структуры данных, на которую ты указываешь.
это кто написал? что "кастинг нужен лишь для опеределения размера структуры данных")))) ладно, флейм завязываю, удачи на дорогах
-
neuralNetwork
- Сообщения: 119
- ОС: Debian Squeeze
Re: malloc...
Если Вы пишете приведение только для этого, тогда лучше будет
Код: Выделить всё
t = malloc(n*sizeof(*t))