Подтвердить что ты не робот

Правильный способ инициализации без подписи Char *

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

unsigned char* tempBuffer;
tempBuffer = "";

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

4b9b3361

Ответ 1

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

Ответ 2

Чтобы "правильно" инициализировать указатель (unsigned char * как в вашем примере), вам нужно сделать просто простую

unsigned char *tempBuffer = NULL;

Если вы хотите инициализировать массив unsigned char s, вы можете выполнить одно из следующих действий:

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);

Ответ 3

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

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

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

unsigned char c = 'c';

unsigned char* tempBuffer = &c;

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

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

Ответ 4

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

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))

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

Ответ 5

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

Обратите внимание, что если вы объявляете указатель на строковый литерал, он должен быть const, i.e.:

const unsigned char *tempBuffer = "";

Ответ 6

Если план предназначен для того, чтобы он был буфером, и вы хотите переместить его позже, чтобы указать на что-то, затем инициализируйте его до 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 );

Ответ 7

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

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


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

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

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

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