2017-04-11 75 views
0

鉴于这种代码:C + +我正确的存储每个变量的位置?

void myFunction (int * a) { 
    *a = 10; 
} 

int main() { 
    int *b = new int; 
    *b = 20; 
    myFunction(b); 
} 

我说得对不对认为两者一个和文字值存储在堆栈(与一个拿着文字值10的内存地址)?

而且也,是正确地说,b存储在堆栈而值存储在堆中?

谢谢!

+2

文字值不存储在堆栈中,它们被复制那里当变量被初始化。 – Havenard

回答

0

不完全。 myFunction()收到一个指向堆分配的指针int。因此,虽然a存储在堆栈中,但数字10存储在堆中。

因为ab都是相同的指针,所以同一个指针显然会一次指向一个地方。

某些其他调用者肯定可以调用myFunction(),将指针传递给某些int变量,该变量在本地范围内声明,因此存储在堆栈中。在这种情况下,myFunction()的参数以及它指向的内容将最终驻留在堆栈上。但在这种情况下,指针指向在动态范围中实例化的int,因此存储在堆中。

0

从技术上讲,C++没有“堆栈”的概念。相反,适当的术语将是“存储持续时间”。

对象自动存储时间段通常被认为是“存储在堆栈中”,但这并不意味着有关实际线程堆栈的任何内容。

而是自动存储时间保证你的对象的生命周期势必范围只在定义

你的情况,你有两个对象具有自动存储时间:int *b,在main()的范围界定,和int* amyFunction。这两个都是int的指针;

你有第三个目的是与new int语句创建一个int;它具有动态存储持续时间,即存储在堆上。 ab都用于修改其值。

最后的文字不存储在所有。一个文字是一个固定值,所以它会被硬编码到你的二进制文件中。再一次,这并不意味着实际值被“存储”在二进制文件中,而是编译器只是说明了使用该值的效果,例如,

a = 0; 

可被编译为

xor rax,rax 

其没有明确提到0