某本书上看到的面试题,不太懂。有木有人帮忙解决一下子?最好既懂C又懂点汇编的来

某本书上看到的面试题,不太懂。。有木有人帮忙解决一下?最好既懂C又懂点汇编的来
以下两段C代码转换成汇编指令后,感觉都一样。但是输出完全不一样啊?

char *strA()
{
char str[]="hello world";
return str;
}

对应汇编如下:

152:      char str[]="hello world";
004016C8   mov         eax,[string "hello world" (0046f020)]
004016CD   mov         dword ptr [ebp-0Ch],eax
004016D0   mov         ecx,dword ptr [string "hello world"+4 (0046f024)]
004016D6   mov         dword ptr [ebp-8],ecx
004016D9   mov         edx,dword ptr [string "hello world"+8 (0046f028)]
004016DF   mov         dword ptr [ebp-4],edx
153:      return str;
004016E2   lea         eax,[ebp-0Ch]
154:  }


这段代码004016CD处把字符串的首地址用 dword ptr [ebp-0Ch],保存起来,然后在004016E2处把保存的首地址用eax寄存器储存,然后把eax压入栈,然后输出,但是这个代码输出的结果是一堆乱码。
而下面这段代码

char *strA()
{
char *str="hello world";
return str;
}

对应的汇编如下:

157:      char *str="hello world";
004016C8   mov         dword ptr [ebp-4],offset string "hello world" (0046f020)
158:      return str;
004016CF   mov         eax,dword ptr [ebp-4]

同样是把字符串首地址保存起来,然后能正确输出结果。
这是为何?

------解决方案--------------------
第一个返回值是栈上的局部变量的地址,经典的错误。
第二个返回值是常量区地址,永远有效,正确。
------解决方案--------------------
或者说:
lea         eax,[ebp-0Ch] ; eax = ebp-0Ch
mov         eax,dword ptr [ebp-4] ;  eax = *(ebp-4)
------解决方案--------------------
第一个: 不要返回栈上对象的地址或引用,否则后果自负。 
------解决方案--------------------
引用:
Quote: 引用:

从汇编来看,第一个是通过lea得到返回值,第二个是mov,这是本质区别

我看网上说lea和mov差不多的,只不过lea用于较为复杂的值。不太懂有什么本质区别。。。

一个是拷贝值(MOV), 一个是取地址(LEA)。