2013-02-27 2 views

ответ

5

Что вы не понимаете точно? Код объявляет short int*, который является указателем на один или более 16 бит (не менее 16 бит) целых чисел со знаком. Он инициализирует его указателем, возвращаемым malloc, который представляет собой кусок памяти, достаточно большой, чтобы соответствовать 1000 * 16 байтам.

Теперь, почему они использовали 1000 * 16? Я не знаю. Обычно вы выделяете по линиям num_elements * sizeof(element), то есть num_elements * sizeof(short int).

Подробнее канонически используйте num_elements * sizeof(*work), чтобы ваш код не сломался, если вы измените тип указателя.

Также обратите внимание, что it is a bad idea to cast the return value of malloc in C.

+0

короткий int * произведение = (короткий int *) malloc (1000 * 16); \t \t size_t n; \t в то время как ((п = Fread (работа, 2, 1000, info.in))> 0) { \t \t \t \t \t \t \t \t \t FWRITE (работа, 2, п, info.out) ; \t} – user2113735

+0

@ пользователь2113735: ok. Это был вопрос? –

2

Давайте разбить его:

  • short int * work

Это объявляет указатель на int, называется work. Он объявлен как short int, что означает, что он должен быть:

  • по меньшей мере, 16 битов в длину (или два 8 бит байта), и
  • не больше, чем обычный int.

Как правило, шорты используются, когда int может быть слишком большим. В Википедии есть отличная разбивка типов данных C здесь: http://en.wikipedia.org/wiki/C_data_types

  • = (short int *) malloc(1000*16);

Выделяет 1000 * 16 байт, и присваивает его к указателю. Вы можете узнать больше о malloc()in the malloc() man page. Эта специфическая линия является примером плохого стиля, потому что:

  • Это ненужно отливать результат таНоса - см Do I cast the result of malloc?
  • Поскольку размер short int не определен в стандарте, эта линия не гарантированно произведёт любое конкретное число short int с.

Было бы лучше вместо написать:

short int * work = malloc(sizeof(short int) * NUMBER_OF_SHORT_INTS_REQUIRED); 

или, еще лучше:

short int * work = malloc(sizeof(work[0]) * NUMBER_OF_SHORT_INTS_REQUIRED); 

Не забудьте проверить, чтобы убедиться, что таНос не вернулся NULL, прежде чем делать что-либо с work.

2

Вы резервируете (динамически = во время выполнения) 1000 * 16 = 16000 байт с помощью malloc. Используя malloc, вы получаете указатель на адрес первого байта зарезервированных 16000 байтов. Вы сохраняете результат указателю, который у вас есть для коротких целых чисел с именем «work». Как правило, каждое короткое целое число имеет размер 2 байта, поэтому, по существу, malloc зарезервировал место для 8000 коротких целых чисел (при условии, что это удалось).

Если malloc не смог выделить пространство, он возвращает NULL.

И, наконец, плохой практикой является то, что вернул malloc.

2

Пила "декларации" в вашем названии.

У них очень хороший сайт для сложных объявлений. here

Смежные вопросы