问题描述
我有一个用于字符数组的 List 类。我想将 N 个数组从 'a' 推回到 'a..a'。
char* x;
SList list;
for (unsigned int i = 1; i < n+1; i++) {
x = new char[i+1];
for (unsigned int j = 0; j < i; j++) {
x[j] = 'a';
}
x[i] = '\0';
list.push_back(&x);
}
但每次,x 都有相同的地址。结果,我的 List 对象包含 N 个指向同一地址的指针。 有没有办法通过正确的内存分配将这些数组推回循环中?
在询问之前发现了这个 question,但它没有为我的问题提供一个很酷的解决方案。
解决方法
在循环的每次迭代中,x = new char[i+1];
返回一个不同地址,该地址存储在 x
中。因此,x
的值在每次迭代中都会发生变化,而 x
的地址却没有。
你的意思是
list.push_back(x);
添加新分配内存的地址?当然,这需要您更改 list
的类型 char *
的集合。
必须提到的是,在 &x
超出范围后取消引用 x
会导致未定义的行为,因为 x
不再存在。您用悬空指针填充 list
。
最后我想提一下,您可以避免讨厌的手动内存管理,只需使用 std::vector<std::string>
。
std::vector<std::string> list;
for (unsigned int i = 1; i < n+1; i++) {
std::string newString(i,'a'); // string with i times 'a'
list.push_back(newString);
}
,
好的。我找到了一个非常简单的解决方案:
char** x = new char*[n];
SList sl;
for (unsigned int i = 0; i < n; i++) {
x[i] = new char[i+1];
for (unsigned int j = 0; j < i; j++) {
x[i][j] = 'a';
}
x[i][i] = '\0';
sl.push_back(&x[i]);
}
有 N 个地址来存储指向数组的指针。我可以将他们的地址添加到我的列表对象中