2015-09-04 154 views
-3

我有这样的代码:指针在C++ /静态范围

int foo() { 
    int r = 100; 
    int *s = &r; 
    return *s; 
} 

void main() { 
    cout << foo(); 
    system("pause"); 
} 

我想结果应该是垃圾值,而不是100

但是,当我在Windows 8.1和Mac OS X的测试,结果是100.

有人可以向我解释吗?

+4

请看一本书 –

+0

对我来说,它应该返回100,看起来相当简单。为什么你认为它应该是垃圾? – dietbacon

+0

因为当'return * s'时,它会返回'r'的内存,但是当'foo'完成时,'r'的内存将被删除。所以我认为结果应该是垃圾值 – Forrest

回答

2

这是因为* s只是指针指向的值。

如果您有:

int a = 2; 
int *b = &a; 
printf("%d\n", *b); 
a = 3; 
printf("%d", *b); 

它会打印:

2 
3 

但如果你有:

int a = 2; 
int b = 3; 
int *c = &b; 
printf("%d\n", a); 
a = *c; 
printf("%d\n", a); 
*c = 5; 
printf("%d\n", a); 

它会打印

2 
3 
3 

而不是

2 
3 
5 

,因为当你做a = *c;只是复印时c成的价值,但建立C和A之间没有进一步的关系,这意味着你可以变动c,或者它指向的值什么你想要的,而且a会继续保持你做这个任务时的那个价值。他们在内存中有两个不同的空间,而a = *c所做的仅仅是将c指向的值复制到

我的意思是当你返回*s时,你不会将地址返回到内存s指向,但它包含的值

+0

@ user4581301谢谢:)固定 – dietbacon

2

不,不应该有“垃圾价值”。 s指向相同范围内的对象,当函数退出时sr都将被销毁。在r销毁之前,您可以安全地解除引用s

另外void main()不正确。

+0

'void main()'应该改为'int main()' 当你使用void而不是int时,大多数编译器会返回一个错误。 – Quiver

+0

添加到我以前的评论。你不使用'void main()'的原因是因为它是使用'int main()'的标准 - 你可以在这里阅读更多关于它的信息:http://stackoverflow.com/questions/4207134/what-是正确的主要声明 – Quiver