Ошибка сегментации в memcpy при использовании указателя источника на массивC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Ошибка сегментации в memcpy при использовании указателя источника на массив

Сообщение Anonymous »

У меня есть программа, которая выглядит следующим образом:
Buffers.h

Код: Выделить всё

#define BUF_LEN 1200
extern uint16_t mybuf1[BUF_LEN];
extern uint16_t mybuf2[BUF_LEN];
Buffers.cpp

Код: Выделить всё

uint16_t mybuf1[BUF_LEN] = { 0 };
uint16_t mybuf2[BUF_LEN] = { 0 };
MyCode.cpp

Код: Выделить всё

#include "Buffers.h"

void GetBuffer(int index, uint16_t *pData, int dataLen)
{
uint16_t *bufPtr = (index == 0) ? mybuf1 : (index == 1) ? mybuf2 : nullptr;
if (pData)
{
memcpy(pData, bufPtr, dataLen * (int)sizeof(uint16_t));
}
}

int main()
{
uint16_t *pData = new uint16_t[BUF_LEN];
GetBuffer(0, pData, BUF_LEN);
// do stuff
delete[] pData;
return 0
}
При попытке запустить это, я получаю сообщение об ошибке сегментации в memcpy.
Я пробовал отладку с помощью отладчика и кажется, что все указатели указывают на правильные адреса. bufPtr указывает на тот же адрес, что и mybuf1, как и ожидалось, а pData правильно выделен.
Странно то, что при изменении функции GetBuffer для использования mybuf1< /code> непосредственно как указатель на источник, все работает хорошо:

Код: Выделить всё

memcpy(pData, mybuf1, dataLen * (int)sizeof(uint16_t));
Кроме того, замена троичного присваивания на более простой вариант также решает проблему:

Код: Выделить всё

uint16_t *bufPtr = index ? mybuf2 : mybuf1;
Компилятор clang 10.0

Подробнее здесь: https://stackoverflow.com/questions/793 ... o-an-array
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»