2013-02-22 2 views
2

Когда мы используем memset, мы устанавливаем его с нулем.Зачем нам нужно memset всегда с нулем?

Почему? Почему не с 1 или 2 или что-то еще.

Кроме того, установка на 0-структуру, кажется, работает, но установка 1 не:

typedef struct abc{ 
    int a; 
} abc; 

int main() 
{ 
    abc* ab; 
    memset(ab, 0, sizeof(abc));// it sets abc->a = 0; correct 
} 

Но вместо 0 если я использую 1 как:

memset(ab, 1, sizeof(abc)); 

то значение abc->a = garbage или not equals to 1

Почему?

+1

Поскольку 'memset' устанавливает все ** байты ** в указанное значение, а не целое число в целом. – sgarizvi

+1

Ваша программа никогда не выделяет пункт назначения указателя 'ab'. Программа - это неопределенное поведение (но это не должно быть причиной того, почему 'ab-> a' не является одним). –

+0

, потому что 0 - начальное значение. –

ответ

11

Вам не всегда нужно memset 0, это просто самый распространенный (и полезно), что нужно сделать.

memset устанавливает каждый байт на некоторое заданное значение. int состоит из 4 байт, поэтому, когда memset ИНГ 1, вы бы установить каждый из них 4 в 1, то вы бы 00000001 | 00000001 | 00000001 | 00000001 = 16843009 (первые числа в двоичной системе, последние в десятичной системе).

Также - обратите внимание, что вы никогда не выделяете память для ab. Несмотря на то, что теперь ваш код может работать, это небезопасно. Это было бы:

abc ab; 
memset(&ab, 0, sizeof(abc)); 
1

Как показано в вашей программе Когда переменная определена, по умолчанию она укажет на любое местоположение, и любые ранее загруженные данные могут быть доступны ранее.

В общем случае мы имеем memset to (0) zero, чтобы убедиться, что переменная инициализирована на ноль, так что позже в программе мы можем доверить, что значение, присвоенное переменной, действительно присвоено значению, а не мусору.

надеюсь, что это помогает .....

+0

Почему только с '0'? Почему бы и нет никакой другой ценности? –

+0

Cuz «0» является наиболее распространенным значением для установки чего-либо. Предположим, вы установили значения в «3». Теперь эта же структура читается любым другим приложением, написанным каким-то другим парнем. Теперь он подумает, что ab-> a = 3 является допустимым значением и будет использовать его для дальнейшей обработки данных. Но если вы отправите ab-> a = 0, он будет знать, что ваша структура не несет никаких достоверных данных и остановит выполнение в этой точке. – Abhineet

+0

, потому что все мы знаем, что нуль ничего не представляет (пустой). Вот почему. Вы можете попробовать с 1,2 до 255 любого значения и в том случае, если вы хотите использовать его для сравнения. но вы должны знать, что memset применяется ко всем байтам. Например, в вашем случае структура имеет int как член и, предположив int как 4 байта, она назначит 1 всем 4 байтам, поэтому при печати значения вы не получите 1, а десятичную 4369 или 0x1111. Так что будь осторожен. –

2

Значение, которое вы используете с memset() для установки памяти зависит от ваших потребностей. Это все. Никто не мешает вам использовать любое другое значение для инициализации памяти.

1

Во-первых, ваша программа получила неопределенное поведение: reaosn - это память для abc * ab; никогда не выделяется!

Во-вторых, требуется, чтобы строка была прервана с помощью «null», что означает, что это конец, поэтому, вдохновленный этим, мы используем null в memset. Но вы можете использовать любое значение, которое вы хотите ...

+0

Говорить о 'zero' вместо' null' было бы менее сложно. – alk

2

Как уже упоминалось, 0 в значительной степени произволен.Однако, если мы должны были выбрать причины, это для удобства (за счет безопасности - вы должны предпочитать явно инициализировать переменные, если вы когда-либо зависят от них):

  • 0 в основном понимается как начальное значение для целых чисел , знаком или без знака, так как оно не равно 0 независимо от ширины или байтов
  • 0 представляет собой строку с истекшим для char* с
  • 0 часто 0.0 для чисел с плавающей точкой
  • 0 часто NULL в C, гарантируется NULL в C++
+0

Как 0 гарантированно установить переменную с плавающей запятой 0.0? Какая часть языка Стандартные гарантии на то, что? –

+1

@AlexeyFrunze: Существуют другие стандарты, помимо языкового стандарта, и некоторые из них более распространены. –

+0

@BenjaminLindley Итак, вы согласны с тем, что языковой стандарт не гарантирует, что 0.0 представлен wi го всех нулевых битов? –