在这里筛选了很多帖子之后,遇到了很多麻烦。所有东西都编译但是我在这个函数中遇到了崩溃,这个函数应该动态地将一个数组的地址分配到这个指针数组中。我看到发布了一个或两个内存地址,所以我不确定为什么它会在中间崩溃。
string *copyArray(string ptrArray[],int sizeArray)
{
string **dynamString = new string*[sizeArray];
int i;
for (i=0;i<=sizeArray;++i)
{
(*dynamString[i]) = ptrArray[i];
cout << dynamString[i];
}
return *dynamString;
}
来自主要我:
string *arrPtr;
和函数调用
arrPtr = copyArray(arrayOfStrings, arraySize);
答案 0 :(得分:7)
for (i=0;i<=sizeArray;++i)
访问数组后面的元素,产生 未定义的行为 。元素从0
索引到sizeArray - 1
。另一个问题是你分配了指针数组:
string **dynamString = new string*[sizeArray];
然后你要解除这些指针,尽管它们还没有指向任何对象:
(*dynamString[i]) = ptrArray[i];
也会导致未定义的行为。如果你想创建一个深层副本,你也应该为每个对象分配内存:
for (i = 0; i < sizeArray; ++i)
{
dynamString[i] = new std::string(ptrArray[i]);
cout << *dynamString[i];
}
但是,您应该尽可能避免使用C风格的数组,而是更喜欢使用STL容器。在这种情况下,它可能是整洁的std::vector<std::string>
及其构造函数,它将与您的函数相同(只是以更安全,更合理的方式,没有可能的内存泄漏):
std::vector<std::string> myStrings(arrayOfStrings, arrayOfStrings + arraySize);
答案 1 :(得分:1)
好的我在这里修好了。我的指针语法不正确。这是正确的语法。
dynamString[i] = &ptrArray[i];