我有这段代码:
int foo() {
int r = 100;
int *s = &r;
return *s;
}
void main() {
cout << foo();
system("pause");
}
我认为结果应该是垃圾值,而不是100。
但是当我在Windows 8.1和Mac OS X中测试它时,结果是100。
有人可以向我解释一下吗?
答案 0 :(得分:2)
不,不应该有“垃圾价值”。 s
指向同一范围内的对象,当函数退出时,s
和r
都会被销毁。在s
被销毁之前,您可以安全取消引用r
。
void main()
也不正确。
答案 1 :(得分:2)
那是因为* s只是指针指向的值。
如果你有:
scope path: ":account_id", as: "account" do
resources :projects
end
它会打印出来:
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
时它只是将c的值复制到a中,但c和a之间没有建立进一步的关系,这意味着你可以改变c或它指向你想要的任何值,以及a会继续持有你执行该任务时所拥有的那个值。它们在内存中有两个不同的空间,a = *c;
所做的只是复制c指向的值
我的意思是,当你返回a = *c
时,你没有将地址返回到内存*s
指向的地址,但是它包含的值