Правильный Способ Инициализации Unsigned Char*

каков правильный способ инициализации unsigned char*? В настоящее время я делаю это:

unsigned char* tempBuffer;
tempBuffer = "";

или я должен использовать memset(tempBuffer, 0, sizeof(tempBuffer)); ?

7 ответов


второй метод оставит вас с нулевым указателем. Обратите внимание, что вы не объявляете пространство для буфера здесь, вы объявляете указатель на буфер, который должен быть создан в другом месте. Если вы инициализируете его в "", что сделает указатель на статический буфер с ровно одним байтом-нулевым Терминатором. Если вам нужен буфер, в который вы можете записать символы позже, используйте предложение массива Фреда или что-то вроде malloc.


для" правильной " инициализации указателя (unsigned char * как в вашем примере), что вам нужно сделать просто

unsigned char *tempBuffer = NULL;

если вы хотите инициализировать массив unsigned chars Вы можете сделать любой из следующие вещи:

unsigned char *tempBuffer = new unsigned char[1024]();
// and do not forget to delete it later
delete[] tempBuffer;

или

unsigned char tempBuffer[1024] = {};

Я бы также рекомендовал взглянуть на std::vector<unsigned char>, который вы можете инициализировать следующим образом:

std::vector<unsigned char> tempBuffer(1024, 0);

поскольку это указатель, вы либо хотите инициализировать его до NULL сначала следующим образом:

unsigned char* tempBuffer = NULL;
unsigned char* tempBuffer = 0;

или назначить адрес переменной, например:

unsigned char c = 'c';

unsigned char* tempBuffer = &c;

изменить: Если вы хотите присвоить строку, это можно сделать следующим образом:

unsigned char myString [] = "This is my string";
unsigned char* tmpBuffer = &myString[0];

если вы знаете размер буфера при компиляции:

unsigned char buffer[SIZE] = {0};

для динамически выделенных буферов (буферов, выделенных во время выполнения или на кучу):

1.Предпочитаю new оператор:

unsigned char * buffer = 0;  // Pointer to a buffer, buffer not allocated.
buffer = new unsigned char [runtime_size];

2.Многие решения для "инициализации" или заполнения простым значением:

std::fill(buffer, buffer + runtime_size, 0); // Prefer to use STL
memset(buffer, 0, runtime_size);
for (i = 0; i < runtime_size; ++i) *buffer++ = 0;  // Using a loop

3.Сторона языка C обеспечивает выделение и инициализацию одним вызовом.
функция не вызов конструктора объекта:

buffer = calloc(runtime_size, sizeof(unsigned char))

обратите внимание, что это также устанавливает все биты в буфере в ноль; вы не получаете выбора в начальном значении.


Это зависит от того, чего вы хотите достичь (например, вы когда-нибудь хотите изменить строку). См., например,http://c-faq.com/charstring/index.html для получения более подробной информации.

обратите внимание, что если вы объявляете указатель на строковый литерал, он должен быть!--1-->, например:

const unsigned char *tempBuffer = "";

Если план заключается в том, чтобы он был буфером, и вы хотите переместить его позже, чтобы указать на что-то, затем инициализируйте его в NULL, пока он действительно не укажет где-то, на что вы хотите написать, а не пустую строку.

unsigned char * tempBuffer = NULL;
std::vector< unsigned char > realBuffer( 1024 );
tempBuffer = &realBuffer[0]; // now it really points to writable memory
memcpy( tempBuffer, someStuff, someSizeThatFits );

ответ зависит от того, для чего вы ввели использовать беззнаковый символ. Чар-это ничего еще, но небольшое целое число, которое имеет размер 8 бит на 99% всех реализаций.

C имеет некоторую поддержку строк, которая хорошо подходит для char, но это не ограничивает использование char строками.


правильный способ инициализации указателя зависит от 1) его области и 2) его предполагаемого использования.

если указатель объявлен статическим, и/или объявленный в области файла, тогда ISO C / C++ гарантирует, что он инициализирован в NULL. Пуристы стиля программирования все равно установили бы значение NULL, чтобы сохранить свой стиль в соответствии с переменными локальной области, но теоретически это бессмысленно.

как инициализировать его... установите значение NULL. Не устанавливайте его на"", Потому что это выделит статический фиктивный байт, содержащий нулевое завершение, которое станет крошечной утечкой статической памяти, как только указатель назначена на что-то другое.

может возникнуть вопрос, почему вам нужно инициализировать его на что-либо вообще в первую очередь. Просто установите его на что-то действительное, прежде чем использовать его. Если вы беспокоитесь об использовании указателя, прежде чем дать ему допустимое значение, вы должны получить правильный статический анализатор, чтобы найти такие простые ошибки. Даже большинство компиляторов поймают эту ошибку и дадут вам предупреждение.