#include <iostream>
#include <string.h>
using namespace std;
/*
The functions defined below are attempting to return address of a local
variable and if my understand is correct...the main function should be
getting garbage.
*/
int *test1(){
int a[2]={1,2};
return a; //returning address of a local variable - should not work.
}
char *test2(){
char a[2]={'a','b'};
return a; //returning address of a local variable - should not work.
}
char *test3(){
char a[1];
strcpy(a,"b");
return a; //returning address of a local variable - should not work.
}
char *test4(){
char a[2];
strcpy(a,"c");
return a; //returning address of a local variable - should not work.
}
int main()
{
int *b= test1();
cout<<*b<<endl; //gives back garbage.
char *c=test2();
cout<<*c<<endl; //gives back garbage.
char *d=test3();
cout<<*d<<endl; //this works - why?
char *e=test4();
cout<<*e<<endl; //gives back garbage.
return 0;
}
就我对函数调用和内存管理的理解而言,这个示例程序让我感到困惑。如果我理解正确,b = test1()和c = test2()不起作用的原因是因为它们试图返回一旦堆栈内存弹出函数就被擦掉的局部变量的地址。但那么为什么d = test3()有效?
答案 0 :(得分:2)
你运气不好,因为程序没有爆炸。
strcpy(a,“b”);在test3中基本上是邪恶的,因为在a中有1个字符的空间,并且已知strcpy复制双引号中的一个字符,加上终止NUL字符,它会覆盖程序实际上没有分配的内存。 / p>
建议您将编译器警告级别置于最高级别。大多数编译器会礼貌地给你至少一个关于它的警告信息。
答案 1 :(得分:0)
你第三个例子工作的原因可以归结为&#34;月亮的阶段是正确的&#34;。
所有示例都是未定义的行为,因为它们将引用(或指针)返回给局部变量。未定义的行为意味着任何事情都可能发生 - 包括有时正确的事情 TM ,即您实际意味着发生的事情。