Я только начал работать с C и наткнулся на строку кода, которую я не понимаю. Может кто-нибудь объяснить, что он делает?Понимание деклараций, malloc и других частей этой строки кода C
short int * work = (short int *) malloc(1000*16);
Я только начал работать с C и наткнулся на строку кода, которую я не понимаю. Может кто-нибудь объяснить, что он делает?Понимание деклараций, malloc и других частей этой строки кода C
short int * work = (short int *) malloc(1000*16);
Что вы не понимаете точно? Код объявляет 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.
Давайте разбить его:
short int * work
Это объявляет указатель на int
, называется work
. Он объявлен как short int
, что означает, что он должен быть:
int
.Как правило, шорты используются, когда int
может быть слишком большим. В Википедии есть отличная разбивка типов данных C здесь: http://en.wikipedia.org/wiki/C_data_types
= (short int *) malloc(1000*16);
Выделяет 1000 * 16 байт, и присваивает его к указателю. Вы можете узнать больше о malloc()
in the malloc()
man page. Эта специфическая линия является примером плохого стиля, потому что:
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
.
Вы резервируете (динамически = во время выполнения) 1000 * 16 = 16000 байт с помощью malloc. Используя malloc, вы получаете указатель на адрес первого байта зарезервированных 16000 байтов. Вы сохраняете результат указателю, который у вас есть для коротких целых чисел с именем «work». Как правило, каждое короткое целое число имеет размер 2 байта, поэтому, по существу, malloc зарезервировал место для 8000 коротких целых чисел (при условии, что это удалось).
Если malloc не смог выделить пространство, он возвращает NULL.
И, наконец, плохой практикой является то, что вернул malloc.
Пила "декларации" в вашем названии.
У них очень хороший сайт для сложных объявлений. here
короткий 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
@ пользователь2113735: ok. Это был вопрос? –