栈中的数据是如何访问的?
面试的时候被问到,数组a[10]是存放在堆中还是栈中,我下意识的就回答,是在栈中。可是面试官一脸诡异的问我肯定吗?犹豫了一下,点头肯定。
然而回来后自己用电脑试了一下,反汇编,如图
#include <iostream>
using namespace std;
int main()
{
char buf[10]={11,12,13,};
buf[0]=3;
buf[2]=5;
char *f=NULL;
f=(char*)malloc(15);
f[1]=9;
free(f);
return 0;
}
反汇编代码:
char buf[10]={11,12,13,};
01394388 mov byte ptr [buf],0Bh
char buf[10]={11,12,13,};
0139438C mov byte ptr [ebp-13h],0Ch
01394390 mov byte ptr [ebp-12h],0Dh
01394394 xor eax,eax
01394396 mov dword ptr [ebp-11h],eax
01394399 mov word ptr [ebp-0Dh],ax
0139439D mov byte ptr [ebp-0Bh],al
buf[0]=3;
013943A0 mov eax,1
013943A5 imul eax,eax,0
013943A8 mov byte ptr buf[eax],3
buf[2]=5;
013943AD mov eax,1
013943B2 shl eax,1
013943B4 mov byte ptr buf[eax],5
char *f=NULL;
013943B9 mov dword ptr [f],0
f=(char*)malloc(15);
013943C0 mov esi,esp
013943C2 push 0Fh
013943C4 call dword ptr ds:[13A03BCh]
013943CA add esp,4
013943CD cmp esi,esp
013943CF call __RTC_CheckEsp (013912D5h)
013943D4 mov dword ptr [f],eax
f[1]=9;
013943D7 mov eax,1
013943DC shl eax,0
013943DF mov ecx,dword ptr [f]
013943E2 mov byte ptr [ecx+eax],9
不是说放在栈中吗?栈中的数据访问不是用push和pop吗,为什么可以直接 这样“ mov byte ptr buf[eax],3 ” 用地址就可以访问,这样一来和堆有啥区别?还是说这个栈和数据结构中栈 完全两码事?
哪本书或者网址讲了这方面的东西,能不能说一下书名或者给个链接也行。