【问题标题】:changing values in wchar_t* []改变 wchar_t* [] 中的值
【发布时间】:2015-10-31 18:43:15
【问题描述】:

我有这个代码:

char *charTable[] = { "test1", "test2", "test3" };
size_t originSize[] = { 6, 6, 6 };
wchar_t* textValues[3];
const size_t newsize = 100;

for (int i = 0; i < 3; i++) {
    wchar_t wcstring[newsize];
    size_t convertedChars = 0;
    mbstowcs_s(&convertedChars, wcstring, originSize[i], charTable[i], _TRUNCATE);
    wcscat_s(wcstring, L"");
    textValues[i] = wcstring;
}

我想将"test1""test2""test3" 放入textValues 中作为wchar_t*,但在循环后textValues 包含"test3""test3""test3"

【问题讨论】:

  • wcstring 在循环后超出范围,这意味着 textValues[i] 是一个悬空指针(意味着它没有指向任何有效的指针)。

标签: c++ char wchar-t


【解决方案1】:

首先,您需要将目标指针初始化为:

textValues[i] = new wchar_t[newsize];

然后,不要分配textValues[i] = wcstring;(这会产生浅拷贝),而是使用wcscpy

wcscpy(textValues[i], wcstring);

或者使用更安全的wcscpy_s

wcscpy_s(textValues[i], newsize, wcstring);

最后,用完后记得delete新分配的内存:

delete [] textValues[i];

完整样本:

char *charTable[] = { "test1", "test2", "test3" };
size_t originSize[] = { 6, 6, 6 };
wchar_t* textValues[3];
const size_t newsize = 100;

for (int i = 0; i < 3; i++) {
    wchar_t wcstring[newsize];
    size_t convertedChars = 0;
    mbstowcs_s(&convertedChars, wcstring, originSize[i], charTable[i], _TRUNCATE);
    wcscat_s(wcstring, L"");
    textValues[i] = new wchar_t[newsize];
    wcscpy_s(textValues[i], newsize, wcstring);
}

//later
for (int i = 0; i < 3; i++) {
    delete [] textValues[i];
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-23
    • 2020-01-24
    • 2020-03-10
    • 2012-10-11
    • 2016-07-06
    • 1970-01-01
    • 2017-10-12
    • 2014-12-03
    相关资源
    最近更新 更多