![]() |
1
1
C++支持C所支持的基本数据结构,例如简单数组,但这并不意味着鼓励它这样做。在C++中,通常最好不要编写基本数组,而是使用
也就是说,这个问题是一个访谈问题,因此,尽管不鼓励使用这种方法,但总的来说,让我们看看函数以及数组的初始化和分配。
首先要注意的是,代码没有编译。main函数用一个循环变量保存一个循环
修复编译器错误后,我们可以运行代码,但编译器仍会提供一些警告,我强烈建议您查看:
警告包含了我们目前需要的所有信息。(我确实知道,在面试时,你可能无法访问编译器来查看这些内容,但当你回到家,想知道为什么你会得到这样的回复时,它们会很有帮助)。 警告基本上是说功能正在返回 住址 局部变量的。局部变量一旦离开作用域就会被释放,这就是堆栈的工作方式。当我们声明变量时,我们将其推到堆栈中,一旦声明变量的范围离开,我们就会从范围中弹出变量(或者更确切地说是从变量中分配的内存)。
所以局部变量
是的,这与堆和堆栈有关,因为堆栈上的元素是活动的,而它们在其中声明的范围是活动的,而堆上的元素则保持活动状态,直到它们被明确告知不再活动为止(使用
当您被告知需要在堆上分配数组时,可以使用
记住,使用
我个人也不会这样做,我会使用
通常,C++返回值并按值解析参数(当我们不使用
通过引用
选项)。这意味着我们返回返回的值的副本。这就是我们如何返回简单整数、double或甚至
当我们在C++(或C)中声明一个数组时,我们在内存中分配一个区域,该区域足够大,可以容纳请求的元素数。然后,变量将是指向第一个元素地址的指针。我们实际上复制的是那个地址,而不是它所指的实际区域。因此,函数将返回一个指向不再分配的区域的指针。局部变量
Java是比C++更高级的语言,它允许您以同样的方式操作内存。在Java中,不是原语的所有内容(
|
![]() |
2
1
1: 是的,这是正确的。这通常还会触发编译器发出的警告,即您正在“返回临时地址”或类似的内容。 2: 是的。在函数作用域中声明的所有变量都将放置在堆栈上,并在作用域(函数)结束时自动销毁。要使其保持到您告诉它不要(使用delete/free)为止,您必须使用new或malloc分配内存。 3: 我只写了很少的Java,所以我不能完全回答这个问题,但在用Java编程时,你不必考虑堆栈和堆内存(尽管知道它是如何工作的可能会很有好处)。Java有一个在后台运行的“垃圾收集器”,当不再需要时,它会清理它为您分配的任何堆内存(除int、float等原语外的所有变量都在Java中的堆上分配)。当然,这是以性能为代价的。 在这里,您还可以看到C++中处理内存的不同方法的简要摘要:) Proper stack and heap usage in C++? 编辑1:我刚刚注意到这个程序甚至没有编译。 在主要功能中;有一个for循环,它在不首先将i声明为整数(或他们想要的任何类型)的情况下将i=0。 编辑2:也;正如另一位评论家指出的那样;int a[大小1+大小2]不合法。使之合法;size1和size2必须是常量非参数变量,或者必须在堆上分配。 |
![]() |
Brixton Weiss · 在方法内部创建的实例 7 年前 |
![]() |
Henry Marshall · 通过引用替换JS对象[重构工作代码] 7 年前 |
![]() |
NNguyen · C++采访关于返回int*值的范围问题 7 年前 |
![]() |
cesarknbv · 已分配内存在堆栈或堆中 7 年前 |