char arr[] = "Hello,World\n"; // arr[] 所有元素保存在栈内存上,arr 是个符号地址,没有存储空间
return arr; // warning C4172: 返回局部变量或临时变量的地址
// 即警告返回了指向栈内存的指针,返回后栈内存都会被自动回收
int _tmain(int argc, _TCHAR* argv[])
printf("%s", test()); // 打印出垃圾数据,也可能刚好打印出 "Hello,World,取决于编译器对栈内存回收的处理方法
getchar();
return 0;
代码运行是正常的,无任何错误,但是有一段警告
警告 1 warning C4172: 返回局部变量或临时变量的地址 main.cpp 7 1 ConsoleAppTest
当函数返回时,局部变量和临时对象被销毁,所以返回的地址是无效的。需要修改代码,使其不返回局部对象的地址。
那么如何解决?该怎么修改代码?
以下内容来自(稍作修改):
http://hi.baidu.com/dotcloud/item/302c4414f7f30e5f2b3e222c
以上方代码为例
#include <stdio.h>
#include <tchar.h>
char* test(void)
char *arr = "Hello,World\n"; // "Hello,World\n" 保存在只读常量区,非栈内存不受函数返回影响
return arr; // 其实返回的是 arr 的副本,返回后 arr 变量也销毁,但是其指向常量区不受影响
int _tmain(int argc, _TCHAR* argv[])
printf("%s", test()); // 能打印出 Hello,World
getchar();
return 0;
#include <stdio.h>
#include <tchar.h>
char* test(void)
static char arr[] = "Hello,World\n"; // "Hello,World\n" 保存在静态存储区,非栈内存不受函数返回影响。
return arr; // 同方法1 arr 是个符号地址,没有存储空间
int _tmain(int argc, _TCHAR* argv[])
printf("%s", test()); // 能打印出 Hello,World
getchar();
return 0;
方便理解: 是指针数组, 有 n 个成员,每个成员都是一个指针,共有n个指针
int (*b)[n](指向由整型数据组成的数组的指针)
1.数组指针;指针类型是 int [n]类型的数组.指向n个元素组成的数组的一个指针。
2.b是一个指针,指
不可以用
变量表示数组长度,对数组的大小作动态说明,因为编译器不知道你要多大的内存,就不知道怎么分配内存空间,分配多了你说它浪费,分配少了你说它小气,它干脆认为这是一个错误的语句,但你真正运行的时候它却不会报错,在实际的编程中,往往会发生这种情况,即所需的内存大小取决于实际输入的数据,而无法预先确定。
编译器警告(级别1) C4172 返回局部变量或临时对象的地址
对于这样一个警告,其实是在告诉你不要对一个非成员函数,做返回局部对象的地址or局部变量的地址这样的SB操作!
你又不需要这个函数do链式编程等工作(事实上也do不来!),你想啥呢?干啥要返回这个变量/对象对应类型的引用&呢?
请看以下代码:
//这是个给运算符定义优先级函数 (简易版本)
multimap<char, int>& createOperatorYouxianji(char* operaTor)
如果
函数返回的是一个指针,且这个指针是指向
函数体内创建的一个
临时变量的话,将触发一级
警告。
解决办法、
1 在
临时变量前面加static关键字,使其作用周期变成整个
函数内
2 在
函数体内用new来声明空间,并在
函数体外将其释放,但是这样不利于模块化。
返回了局部或临时变量
不是不能返回局部变量,是不能返回指向局部变量的指针和引用。
因为局部变量在函数退出时就被mark为无效了,所以函数结束后所返回的这个地址不能确保包含能被接下来的代码使用的正确的值。