当我为一个数组指针指定另一个数组指针的值时,我试图理解C ++中会发生什么。说我有:
int *a = new int[10];
int *b = new int[10];
for (int i =0; i< 10; i++) {
a[i] = i;
}
b=a;
当我打印出b
的值时,我得到与a
相同的值。说得通。但实际上在b
指针中保存了什么?它是数组a
的内存地址吗?我尝试打印出&a
和&b
,但我得到了两个不同的值。那么b
如何获得a
的所有值?
此外,如果他们单独存储将会/应该在转移后删除a
吗? delete [] a
谢谢我对C ++很陌生,任何帮助都会很棒。
答案 0 :(得分:7)
首先,您不会将一个数组分配给另一个数组,而是将一个指针分配给另一个指针。如果仅靠这一点并不能让您更容易理解正在发生的事情,那么请继续阅读...
当你这样做时
int *a = new int[10];
int *b = new int[10];
你会得到类似的东西:
+---+ +------------------------+ | a | ---> | Memory allocated for a | +---+ +------------------------+ +---+ +------------------------+ | b | ---> | Memory allocated for b | +---+ +------------------------+
分配后
b = a;
它看起来像这样
+---+ +------------------------+ | a | -+-> | Memory allocated for a | +---+ | +------------------------+ | +---+ | +------------------------+ | b | -/ | Memory allocated for b | +---+ +------------------------+
换句话说,b
指向与a
相同的内存,没有任何内容指向最初为b
分配的内存,因此它无法访问,并且您将拥有内存泄漏。
此外,尝试
delete[] a;
delete[] b;
当您尝试两次释放相同的内存时,将导致未定义的行为。
答案 1 :(得分:1)
您只是指定一个指向数组的指针。因此b
将指向a
的相同地址。
你得到2个不同的地址,因为你打印指针本身的地址而不是指针中存储的地址。
&a != &b //the addresses of the pointer variables are different
a == b // the address stored in the pointers is the same
但实际上在b指针中保存了什么?是记忆吗? 数组的地址a。
存储在a
指针中的内存地址。
此外,如果他们单独存储将/应该删除后 转移?删除[] a
如果删除a
指向的内存,b
将指向已取消分配的内存区域。
答案 2 :(得分:0)
首先,通过b=a
,你有一个memory leak。您正在将数组a的第一个值的地址(假设为&(a[0]) == a
)复制到变量b,因此您完全失去对数组b的第一个值的地址的控制。在执行此类操作之前,您应该始终先调用delete
运算符。
请记住,指针变量总是存储一个地址,但因为它也是一个变量,所以它也有自己的地址。结果,在变量/指针中存储了数组a的第一个值的地址,所以如果你打印一个,你就得到那个地址。如果你打印&a
,你得到的变量/指针a
的地址在这个例子中对你没用。
为了更好地想象一个数组是存储在内存中的连续变量的一个分支,你可以通过总是只知道这些连续变量的第一个值的地址来访问它们。所以,当你说a[0]
时,它就像是说&#34; 让我得到数组第一个变量值的内容&#34;然后当你说a[1]
时,它就像询问位于a[0]
地址的变量值加上a[0]
旁边存储在内存中的确切下一个变量一样变量a[1]
并且也等于*(a+1)
。 (是的,*(a+1)
等于a[1]
等等)
另外,尝试阅读一下指针之间的操作。例如,addressA + 1
等于存储在内存中的下一个地址(来自地址A)。
最后但并非最不重要的是,为了更好地了解这些人员,打印指针的值和地址并使用它们(使用数组和指针解决一些简单的练习)。
答案 3 :(得分:0)
由于b
是指向int的指针,因此为其分配任何内容都将仅分配int的内存地址。本质上,数组只是指针运算的核心,它们的工作原理是根据元素字节大小将特定数量的字节移动到下一个存储器地址。因此,当涉及到数组时,您将拥有指向指针的指针或指针,这些指针最终指向int
或某些其他数据类型,如char
。然后,为了移动到数组的下一个元素,只需将sizeof(int)
添加到指针地址即可获得数组的下一个元素。但是使用指针运算,因为C / C ++已经知道指针所指向的数据类型的字节结构。在指针上下文中使用++
或--
意味着向前或向后移动到数组的下一个元素。
当您指定b = a
时,因为它们都是指向整数的指针,您只需将a
中存储的初始分配内存的第一个元素的地址分配给b
。因此失去了对分配内存的第二个10位的引用。并且由于您丢失了对分配的内存的引用,这将导致内存泄漏,因为没有对delete
的引用。
答案 4 :(得分:0)
如果你想用C ++编程,你必须使用C ++方式。所以使用STL容器。最简单实用的容器是vector:
#include <vector>
std::vector<int> a(10);
std::vector<int> b(10);
for (int i =0; i< a.size(); i++) {
a[i] = i;
}
b=a; //it works!!!
assert(a==b);
不需要对vector使用任何delete运算符。