int *intAddr(){
int i = 16;
return &i;
}
char *charAddr(){
char A = 'a';
return &A;
}
然后我通过
测试这两个功能int *intaddr = intAddr();printf("%d\n", *intaddr);
char *charaddr = charAddr();printf(charaddr);
但结果是只有16个不是'a'。当函数intAddr()结束时,变量i
被破坏。为什么*intaddr
可以获得16?
答案 0 :(得分:4)
你不应该返回一个指向函数local的变量的指针。这是不明确的行为。不要做。 EVER !!
原因是你的函数退出时你的本地变量i
被破坏,所以你的函数退出后的指针将指向最多包含垃圾的内存。
答案 1 :(得分:1)
访问指向已销毁元素的内存会调用未定义的行为。未定义的将会发生,如果您多次运行代码,很可能会发生不同的事情。你上面所做的与顺便访问任何地址没什么不同。
答案 2 :(得分:0)
这只是undefined behavior您只返回自动变量的地址,因此一旦函数退出就不会存在。 未定义的行为可能会发生任何事情,但它不可靠。从草案C ++标准部分6.7
声明声明段落 2 说:
每次执行声明语句时,都会初始化具有自动存储持续时间(3.7.3)的变量。块中声明的具有自动存储持续时间的变量在从块(6.6)退出时被销毁。
答案 3 :(得分:0)
更改此
int *intAddr(){
int i = 16;
return &i;}
到
int *intAddr(){
int* i = new int(16);
return i;