我知道当我们需要为动态内存中的指针数组提供一个指针时我们会使用它,但我不明白它是如何在堆栈中工作的。
这是否也会在堆栈中创建一个指针数组,指向堆中的指针数组,还是在堆栈中创建一个指向堆中指针数组的指针?如果是,那么有什么区别
int **p = new int*[100]
和
int *p = new int[100]
提前致谢。我一直在努力理解这一点,并且在网上阅读了很多文档,但我仍然不明白这一点。
原文由 Shank 发布,翻译遵循 CC BY-SA 4.0 许可协议
int **p
在堆栈上声明一个指针,该指针指向堆上的指针。每个指针都指向堆上的一个整数或整数数组。这个:
意味着您在堆栈上声明了一个指针并对其进行了初始化,使其指向堆上的 100 个指针数组。现在,这 100 个指针中的每一个都没有指向任何地方。 “无处”是指它们既不指向有效的内存块,也不
nullptr
s。它们没有被初始化,因此它们包含一些垃圾值,这些值在分配指针之前就在内存中。在使用之前,您应该在循环中为他们分配一些有意义的东西。请注意p[0]
-p[99]
如果将返回值new
分配给它们,则不能保证指针指向相邻的内存区域。例如,如果您为它们中的每一个分配内存为p[i] = new int[200];
,p[0][201]
不会引用p[1][2]
,但会导致未定义的行为。和这个:
是堆栈上的指针,指向堆上的 100 个整数数组。