我想创建一个为数组分配内存的函数。假设我有这个:
PWSTR theStrings[] = { L"one", L"two", L"three" };
void foo(PWSTR a, int b) {
a=new PWSTR[b];
for(int i=0;i<b;i++) a[i]=L"hello";
return;
}
int main() {
foo(theStrings,4);
}
我的问题是,如何使函数foo和函数调用以便在调用foo之后,theStrings将包含四个“hello”
谢谢:) Reinardus
答案 0 :(得分:2)
要做到这一点,你必须做两件事:
首先,您必须使用动态分配的数组,而不是静态分配的数组。特别是,改变行
PSWTR theStrings[] = { L"one", L"two", L"three" };
到
PWSTR * theString = new PWSTR[3];
theString[0] = L"one";
theString[1] = L"two";
theString[2] = L"three";
这样,你正在处理一个指针,它可以被修改为指向不同的内存区域,而不是使用固定部分内存的静态数组。
其次,你的函数应该是一个指向指针的指针,或一个指针的引用。这两个签名分别如下所示:
void foo(PWSTR ** a, int b); // pointer to pointer
void foo(PWSTR *& a, int b); // reference to pointer
引用指针选项很不错,因为您可以使用旧代码foo
:
void foo(PWSTR *& a, int b) {
a = new PWSTR[b];
for(int i=0;i<b;i++) a[i]=L"hello";
}
对foo
的调用仍然是
foo(theStrings, 4);
所以几乎没有什么必须改变。
使用指向指针的选项,您必须始终取消引用a
参数:
void foo(PWST ** a, int b) {
*a = new PWSTR[b];
for(int i = 0; i<b; i++) (*a)[i] = L"hello";
}
并且必须使用address-of运算符调用foo
:
foo(&theStrings, 4);
答案 1 :(得分:1)
PWSTR theStrings[] = { L"one", L"two", L"three" };
void foo(PWSTR& a, int b) {
a=new PWSTR[b];
for(int i=0;i<b;i++) a[i]=L"hello";
return;
}
int main() {
PWSTR pStrings = theStrings;
foo(pStrings,4);
}
但请注意,请考虑使用std::vector
和std::wstring
等等。
另外,无论如何,请考虑使用函数结果(return
)来表示函数结果,而不是in / out参数。
干杯&amp;第h。,
答案 2 :(得分:0)
如果您不需要使用PWSTR,则可以使用std::vector
< std::string >
或std::valarray
< std::string >
。
如果要存储unicode字符串(或宽字符),请将std::string
替换为std::wstring
。
你可以在这里看到如何在CString / LPCTSTR / PWSTR和std :: string之间进行转换:How to convert between various string types。
答案 3 :(得分:-1)
可能会将其更改为
void foo(PWSTR * a,int b)
和
foo(&amp; thestrings,4);