访问冲突用动态数组写入位置
问题描述:
我有一个成员变量指向一个wchar_t数组,该数组将保存用户通过控制台给出的输入。访问冲突用动态数组写入位置
wchar_t ** mArray;
然后,在我的成员函数中,我要求来自用户的输入并将其存储在std :: wstring中。之后,我使用这个wstring的长度为mArray
动态分配内存,并为for循环分配每个字符。但是,我收到“访问冲突写入位置”错误。
std::wstring givenWstring;
std::cin.ignore();
std::getline(std::wcin, givenWstring);
mArray = new wchar_t*[givenWstring.length()];
for (size_t i = 0; i < givenWstring.length(); i++) {
*mArray[i] = givenWstring.at(i);
}
我不知道,因为我是在动态数组中指定从wstring的每个字符各指标为什么我收到访问冲突错误。
答
您必须将数据存储在您的案例的适当对象的动态数组wchar_t
中。即您需要一个指向wchar_t
的指针来管理该阵列。
std::unique_ptr<wchar_t[]> mArray; // unique_ptr takes care of delete[]
std::wstring givenWstring;
std::cin.ignore();
std::getline(std::wcin, givenWstring);
mArray.reset(new wchar_t[givenWstring.length()+1]);
for(size_t i = 0; i < givenWstring.length(); i++)
mArray[i] = givenWstring.at(i);
mArray[givenWstring.length()] = 0;
然而,这种结构没有可能的原因。到目前为止,保留wchar_t
阵列的最佳方法是std::wstring
。 Moveover,只要你需要像一个原始const wchar_t*
(C风格的字符串)表示,你可以使用std::string::c_str()
,例如
void old_code(const wchar_t*); // some old API
old_code(mArray.c_str());
最后,我要解释一下为什么你的访问冲突。
wchar_t**mArray = new wchar_t*[givenWstring.length()];
分配的wchar_t*
阵列未初始化(因此包含一些随机数据)。然后*mArray
返回这些随机初始化的指针中的第一个,当*mArray[0]=...
尝试在此随机地址写入存储器时。
也许'wchar_t * mArray;'是你需要的吗?然后简单地'mArray = new wchar_t [givenWstring.length()];''和'mArray [i] = givenWstring.at(i);'。 – DimChtz
你的数组包含**未初始化的**'givenWstring.length()'**指针**到'wchar_t'。当你尝试解除引用指针('* mArray [i]')时,你会得到未定义的行为。 –
@DimChtz,对不起。你是否建议我改用wchar_t *? – Skipher