好的,我正在编写一个程序,它将在阵列上执行不同的功能。如有必要,阵列将需要更改容量。说明如下:
这部分是可以理解的,但我不明白的是如何保持对函数将使用的数组的引用。这是我创建新数组并移动元素的代码。
int newSize = m_size*2;
double *tempArray= new double[newSize];
for(int i=0; i<m_size-1; i++)
{
tempArray[i] = arr[i];
}
delete []arr;
for(int i=0; i<m_size-1; i++)
{
arr[i] = tempArray[i];
}
delete []tempArray;
}
所有其他方法都使用 arr ,所以我想引用回来。指针不起作用,因为它只指向第一个元素。如何使用我的arr变量来引用数组?
答案 0 :(得分:2)
在C和C ++中,动态数组通常由指向第一个元素和元素数量的指针表示。所以我假设以下声明:
double *arr;
int m_size;
如果你有arr
作为一个真正的数组double arr[..]
被删除,那么你就不能delete []arr
也不能改变它的大小!
然后你的代码应该是:
int newSize = 2*m_size;
double *tempArray= new double[newSize];
for(int i=0; i<m_size-1; i++)
{
tempArray[i] = arr[i];
}
delete []arr;
arr = tempArray;
m_size = newSize;
但现在我想知道:为什么m_size-1
在循环中?
而且,你可以这样做:
memcpy(tempArray, arr, sizeof(*arr) * m_size)); //or m_size-1?
如果这是一个练习,这一切都很好。对于真实代码,使用std::vector<double>
和resize()
成员函数几乎总是更好。
答案 1 :(得分:1)
您的代码中有未定义的行为。
delete []arr;
for(int i=0; i<m_size-1; i++)
{
arr[i] = tempArray[i];
}
删除指向的内存,然后分配给循环内的已删除内存。相反,你应该写:
delete []arr;
arr = tempArray;
整个代码将是:
int newSize = m_size*2;
double *tempArray= new double[newSize];
for(int i=0; i<m_size-1; i++) // -1 might be wrong, look below for a comment on this line.
{
tempArray[i] = arr[i];
}
delete []arr;
arr = tempArray;
m_size = newSize // stolen from the others *cough* since I oversaw the need.
// note that I don't call delete on tempArray.
}
另外我不知道你是如何分配你的第一个数组的,但是如果你调用了new double[m_size]
那么你就想在for循环的循环条件中删除-1
,因为你'重新检查i < m_size
而非i <= m_size
。
答案 2 :(得分:0)
解除分配后,需要为ar分配内存。
int newSize = m_size*2;
double *tempArray= new double[newSize];
for(int i=0; i<m_size-1; i++)
{
tempArray[i] = arr[i];
}
delete []arr;
ar = new double[newSize];
for(int i=0; i<m_size-1; i++)
{
arr[i] = tempArray[i];
}
delete []tempArray;
答案 3 :(得分:0)
delete []arr;
for(int i=0; i<m_size-1; i++)
{
arr[i] = tempArray[i];
}
糟糕。删除后不要访问。除非分配了新内容,否则不要删除。
您根本无法重新分配声明为
的数组int arr[100]
或类似。
答案 4 :(得分:0)
根据您提供的代码,您目前正在执行的是:
tempArray
)arr
)数组的内容复制到新的(temp
) - (注意 - 如果使新数组小于旧数组会怎样?)arr
,因此您现在无法使用它!)基本上,您需要修复第2步,处理大小,完全摆脱步骤4和5 - 您只需重新分配arr
:
arr = tempArray
答案 5 :(得分:0)
您只需要声明数组arr并将值放入其中。您可以通过其指针arr或使用arr [element_id]的每个元素引用数组。
答案 6 :(得分:0)
你有几个选择:
采用C风格的方法,只需将指针存储到第一个元素,再加上长度。从这两个你可以计算出你需要的任何东西。
使用std::vector。它包含一个数组,允许您使用emplace_back
等函数轻松调整其大小,并可以使用size
函数告诉您它的长度。
第二种方法当然是首选。如果您使用的是C ++,则通常应使用std::vector
而不是原始数组,除非您正在寻找固定大小的数组。在这种情况下,请使用std::array。
您还可以获得复制矢量的额外好处,就像vector1 = vector2;
一样简单。