2014-10-04 3 views
2

Я наткнулся на следующий фрагмент кода. У меня есть 2 вопроса об этом и нужна помощь.Память выделяет и возвращает

int *loc_buff; 
loc_buff = malloc(sizeof(loc_buff[0]) * COUNT_EACH * n); 
memset(loc_buff, -1, COUNT_EACH * sizeof(int) * n); 
  1. Правильно ли использовать SizeOf (loc_buf [0]) вместо SizeOf (INT)?
  2. Будет ли этот memset сбрасывать все loc_buf на -1?

Спасибо.

+3

Вопрос не плох. Почему пустые голоса? –

+0

Я не очень хороший программист на C, хотя только начал его использовать. Одна вещь, о которой я могу думать, - это когда вы используете 'sizeof (* loc_buff)', это позволяет отменить, если на более позднем этапе я изменяю тип '* loc_buff' как указатель на' integer', для указателя на 'char/другой тип данных'.Тем не менее вам не нужно беспокоиться о выделенной памяти, поскольку '* loc_fuff' уже определяет его размер как« 4 (для целых чисел)/1 (для символа/etc ». Следовательно, одно изменение типа данных для переменной , не будет вызывать никаких побочных эффектов для остальной части реализованного кода :-) –

+0

Если один пишет 'sizeof (int)', то если на более позднем этапе один раз изменяет тип переменной от 'int' до' newType' , тогда вам нужно прокрутить код, чтобы изменить соответствующий тип в 'sizeof (newType)' thingy. –

ответ

3

Оператор sizeof имеет две формы: sizeof(type) и sizeof expression. В вашем случае вы можете использовать sizeof(int) или sizeof loc_buff[0] или sizeof *loc_buff с одинаковыми результатами. Обратите внимание, что () являются полностью необязательными, если аргумент sizeof является выражением (а не типом). sizeof оператор имеет высокий приоритет, что делает эти () избыточными в большинстве случаев (включая ваш пример).

Что касается memset ... формально не гарантируется установка loc_buff элементов на -1 в общем случае. Это memset гарантированно заполняет память с помощью битового шаблона 0xFF...F, но то, что этот битовый шаблон означает, что интерпретируется как объект int, зависит от реализации. На машине с 2-мя дополнителями это действительно -1, но на машине, отличной от второго, это нечто совершенно другое.

С самой педантичной точки зрения единственное портативное использование memset имеет с целыми массивами без char, устанавливает все на 0.

+0

что за беспокойство? есть ли в мире какие-либо машины, не содержащие 2'-дополнения? – HuStmpHrrr

+0

@HuStmpHrrr: Ну, это вопрос, который должен быть направлен на комитет по стандартизации C. Они продолжают тщательно поддерживать поддержку 1-го и дополненного представлений величин (они находятся в C11). Если они все еще считают это необходимым, то это необходимо. – AnT

+1

Вы также можете посмотреть здесь http://stackoverflow.com/questions/12276957/are-there-any-non-twos-complement-implementations-of-c – AnT

4

Правильно использовать sizeof(loc_buf[0]) вместо sizeof(int)?

Технически, это правильно, потому что это то же самое: sizeof(loc_buf[0]), sizeof(*loc_buf) и sizeof(int) все же. Однако, поскольку в обоих случаях размер берется для работы с одним и тем же динамически распределенным буфером, это противоречиво. Нужно переписать как sizeof с таким же способом по вашему выбору; не имеет значения, какой из них вы предпочитаете.

Будет ли это memset сбрасывает все loc_buf в -1?

Да, было бы. Ситуация не совсем проста: значение, которое вы поставили, преобразуется в unsigned char, прежде чем будет установлено в элементы блока памяти. В представлении комплемента 2 -1 состоит из всех битов, установленных в 1. он преобразуется в unsigned char со всеми, что устанавливается во всех байтах блока. Теперь весь блок состоит из байтов со всеми их битами, установленными в единицы. Когда эти байты интерпретируются как int s, они снова становятся -1.