欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

关于函数堆栈的问题请教...

程序员文章站 2024-03-24 14:17:46
...

最近一直在学习函数调用时堆栈的变化情况,自己写了一个简单的程序:

#include <stdio.h>
#include <string.h>

int localFun(char,char,char,char,char);


int main(int argc,char* argv[])
{

    if(1==1)
    {
        char c1,c2;
        scanf("%c",&c1);
        printf("c1=%c\r\n",c1);
        scanf("%c",&c2);
        printf("c2=%c\r\n",c2);

        localFun(c1,c2,'A','$','-');

        printf("Main End!\r\n");
    }

    return 0;
}

int localFun(char var1, char var2, char varA, char varB, char varC)
{
    char var3='s';
    char strVar[3];
    //scanf("%c",var3);
    
    printf("input value of strVar:\r\n");
    scanf("%s",strVar);
    printf("Value is input!\r\n");

    char* p0=&var3;

    printf("var1=%c;var2=%c,var3=%c,strVar=%s\r\n",var1,var2,var3,strVar);
    printf("pvar1=%p;pvar2=%p,pvar3=%p,strVar=%p\r\n",&var1,&var2,&var3,strVar);
    printf("var1=%c;var2=%c,var3=%c,strVar=%s\r\n",var1,var2,var3,strVar);
    printf("\r\n");
    char* p=&var3;
    printf("p=%p;p+1=%p,p+2=%p,p+3=%p\r\n",p,p+1,p+2,p+3);
    printf("*p=%c;*(p+1)=%c,*(p+2)=%c,*(p+5)=%c,p+5=%s\r\n",*p,*(p+1),*(p+2),*(p+5),p+5);

    for(int i=0;i<299;i++)
    {
        if(*(p+i)==var1||*(p+i)==var2||*(p+i)==varA||*(p+i)==varB||*(p+i)==varC)
        {
        printf("*(p+%d)=%c,addr=%p,pvar1=%p,pvar2=%p\r\n",i,*(p+i),p+i,&var1,&var2);
        }
    }
    
    return 0;
}


在VMware虚拟机里编译:
关于函数堆栈的问题请教...
运行32位程序结果:
关于函数堆栈的问题请教...

按照网上说的函数调用时,堆栈变化情况应该是这样:
关于函数堆栈的问题请教...
(图片来自网络)
一直搞不明白:运行结果中,堆栈从(p+1)到(p+40)都是什么内容。难道main函数调用子函数时压入堆栈的EIP有40个字节?
在此恳求哪位大神给指点一二,不胜感激!

虚拟机:VMware® Workstation 14 Pro
虚拟操作系统:Deepin 15.4(64位)