Не могу понять, как new или malloc работает с BYTE * - PullRequest
0 голосов
/ 18 марта 2010

Я пытаюсь выделить память на 10 байт

BYTE* tmp;
tmp = new BYTE[10];
//or tmp = (BYTE*)malloc(10*sizeof(BYTE));

Но после операции new или malloc длина * tmp превышает 10 (то есть символ '\ 0' не находится в 10 позиции в массиве tmp)

Почему?

Ответы [ 3 ]

8 голосов
/ 18 марта 2010

Ни new[], ни malloc() не установят \0 для вас. Когда вы вызываете malloc() или new[] для char, блок унитализирован - вам нужно инициализировать его вручную - либо поместите \0 в последний элемент, либо используйте memset() для всего блока.

6 голосов
/ 18 марта 2010

Нет никаких причин для '\0' быть в конце массива.

malloc (или новый, в этом отношении) возвращает вам блок из 10 байтов, то есть памяти, которую он выделил для вас. ваша работа - делать с памятью все, что вы хотите.

Возможно, вы перепутали со строкой (например, char[10]).

Вся идея строки заключается в том, чтобы быть массивом байтов, но который заканчивается '\0' для обозначения его размера.

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

1 голос
/ 18 марта 2010

Во-первых, массив BYTE может содержать нули, поэтому вы не можете использовать strlen для определения длины массива.

Во-вторых, после вызова нового BYTE [10] ваш массив остается неинициализированным (содержит мусор), если вы хотите автоматически инициализировать массив 0, вы можете использовать следующий код:

BYTE* tmp2;
tmp2 = new BYTE[10]();

Но даже в этом случае вы не можете использовать strlen, потому что strlen возвращает 0.

Вы должны сохранить длину массива в некоторой переменной или просто использовать вместо нее std :: vector.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...