类型:转载 责任编辑:asp.net 日期:2007/05/23
热门软件下载:
程序这样写可以正确运行:
char * GetString()
{
char *s="aaaaaaaaaa";
return s;
}
但如果这样写就不能正确运行
char * GetString()
{
char s[]="aaaaaaaaaa";
return s;
}
想必第二个程序段是因为在栈上分配了内存,函数返回时自动回收,但是第一段程序又为什么可以正确运行呢?难道两种定义方式对编译器来讲是不一样的吗?
请高手指教。
网友回答:
char *s="aaaaaaaaaa";//存放在静态存储区,
char s[]="aaaaaaaaaa";局部变量,存在栈中,函数返回就释放了
所以
同意楼上的。
又见到你了。呵呵。
第一个代码是一个char的指针s指向一个字符串常量(const)的首地址,系统给"aaaaaaaaaa"指定了存储位置,当s出了作用域以后,这个地址并没有返回,因而返回一个指针地址
第二个代码是一个char数组,他申请了11个字节的空间
但是由于是局部变量 他脱离GetString()后就脱离了作用于,空间被系统收回
const型变量分配的空间和局部变量分配的空间的地方可能不同吧
听听下面的高手怎么说!
char *s="aaaaaaaaaa";//存放在静态存储区
------------------------------------------------------
我觉得应该这样说:
因为="aaaaaaaaaa";静态字符串,所以在存储的时候存放在“全局变量”区!你返回了指向全局变量的指针在外边当然可以操作了!!
看看汇编就知
一:
; char * GetString()
;
push ebp
mov ebp,esp
;
; {
; char *s="aaaaaaaaaa";
;
@1:
mov eax,offset s@
;
; return s;
;
?live1@32: ; EAX = s
;
; }
二:
; char * GetString1()
;
push ebp
mov ebp,esp
add esp,-12
;
; {
; char s[]="aaaaaaaaaa";
;
@4:
mov eax,dword ptr [$mabmbaia]
mov dword ptr [ebp-12],eax
mov eax,dword ptr [$mabmbaia+4]
mov dword ptr [ebp-8],eax
mov ax,word ptr [$mabmbaia+8]
mov word ptr [ebp-4],ax
mov al,byte ptr [$mabmbaia+10]
mov byte ptr [ebp-2],al
;
; return s;
;
lea eax,dword ptr [ebp-12]
;
; }
;
char *s="aaaaaaaaaa";
等价于:
char *s;
s="aaaaaaaaaa";
s为指针类型,指针指向字符串首地址,当然可以返回字符串。
汇编没看懂,不过问题的答案算是大体清楚了。
这种运行效果应该一样吧:
int * GetValue(void)
{
int *i=1222; //定义指针,指向静态存储区;
return i;
//int i=122; //不正确,同理于GetString(),在栈上分配空间;
//return &i;
}
int *i=1222;
这里自然不是静态(全局变量)区
因为不是字符串
字符串是单独对待的
这里是一个整数
所以是栈中的!
楼住,你确认你说的是对的吗?
第一个可以正确运行,第二个不能正确运行?
在我看来,两个都是正确的,根本没有错~~
尽管1楼说的很不错,但这并不能说明什么问题~~
要是你程序有问题,请检查一下别的方面,这个返回值是不会错的~~
不好意思~~
我刚刚实验了一下~~
的确正如楼住所说~~
第2个是错误的
我收回上面所说的话~~
对不起~~~
编程这么久了 出现问题时 我总是找其他方法避开 没有好好琢磨过~~
wildleon(释尊空相)
int *i = 123;???
能通过,通过了运行也不对呀~~
只能这样 int t = 123;//局部变量
int *i = &t;//这里的i是存储在哪里的呢??
return i;
到是 int i = 123;
return &i;虽然发出警告传递的是地址,但是结果是123.
估计是对于这样的小段程序,被释放的i的空间在短时间里没有被别的进程征用.(哈哈,说的很土)
在我看来,两个都是正确的,根本没有错~~
这个是真确的,不能说是正确的,他分系统而言,在vc++上运行是错误的,在sun机器上运行是正确的。具体原因正在分析
在sun平台上有一个警告是 returns address of local variable
据我分析是程序不能返回本函数中的局部变量地址。
学习!!期待
学习中。