Присвоение значений неподписанному короткому * буферу

#c #buffer #dynamic-memory-allocation

#c #буфер #динамическое выделение памяти

Вопрос:

У меня возникают проблемы с присвоением значения буферам без знака short * и без знака char *. Код выглядит примерно так:

 // Header File
unsigned short* short_buff;
unsigned char* char_buff;
 
 // Implementation File
short_buff = new unsigned short[10];
memset(amp;short_buff, 0, 10);

char_buff = new unsigned char[10];
memset(amp;char_buff, 0, 10);

unsigned short sVal = 0;
unsigned char cVal = 0x0;

// All of these cause core dumps
short_buff[0] = sVal;
memcpy(amp;short_buff[0], amp;sVal, 2); // 2 bytes per unsigned short
std::cout << short_buff[0] << std::endl;

// All of these also cause core dumps
char_buff[0] = cVal;
memcpy(amp;char_buff[0], amp;cVal, 1); // 1 byte per unsigned char
std::cout << char_buff[0] << std::endl;


// Yet strangely these cause no issues
unsigned short s2Val = short_buff[0];
unsigned char c2Val = char_buff[0];
 

Я совершенно не понимаю, что здесь происходит и почему.. Любая помощь будет принята с благодарностью!

Ответ №1:

 memset(short_buff, 0, 10*sizeof(short));
 

и

 memset(char_buff, 0, 10*sizeof(char));
 

Две ошибки, amp; неверно, вы должны передавать значение указателя memset не на адрес переменной указателя. (Эта версия memset(amp;short_buffer[0], ...); также работает).

Во-вторых memset , считает байты, а не элементы, поэтому вам нужно умножить размер массива на размер элемента, используйте sizeof для этого.

Как ни странно, вы поняли это более или менее правильно memcpy позже. Почему не то же самое для memset ?