请教c函数参数入栈的问题
直接上代码
疑问:add_normal2 中 就算short被提升为int入栈 为什么要+8才能定位要下一个地址呢?
show_test2函数 相差的怎么是24?
char * add_normal(int num, ...) {
int *p;
char * ret;
p = &num + 1; //p指向参数列表下一个位置
ret = *(char **)p;
return ret;
}
char * add_normal2(short num, ...) {
short *p;
char * ret;
p = &num + 8; //p指向参数列表下一个位置 为什么要+8才能定位要下一个地址呢 ?
ret = *(char **)p;
// ret = ret + strlen(ret) + 1;
return ret;
}
char * add_normal3(short num, ...) {
char * ret;
int *p;
p = (int *)&num+4;
ret = *(char **)p;
// ret = ret + strlen(ret) + 1;
return ret;
}
void show_test1(int num1, int num2)
{
printf("num1=%d in address [%p]\n",num1, &num1);
printf("num2=%d in address [%p]\n",num2, &num2);
printf("address2-address1=%d\n",(int)&num2-(int)&num1);
}
void show_test2(short num1, int num2)
{
printf("num1=%d in address [%p]\n",num1, &num1);
printf("num2=%d in address [%p]\n",num2, &num2);
printf("address2-address1=%d\n",(int)&num2-(int)&num1);
}
int main(int argc, char **argv) {
printf("%s\n", add_normal(5,"13dsfsdaf",2,3,4,5));
printf("%s\n", add_normal2(5,"13dsfsdaf","2fsdfs",3,4,5));
printf("%s\n", add_normal3(5,"13dsfsdaf","2fsdfs",3,4,5));
printf("%d\n", add_normal4(5,1,2,3,4,5));
show_test1(1,2);
show_test2(1,2);
return 0;
}
liunux 下
输出是
13dsfsdaf
13dsfsdaf
13dsfsdaf
num1=1 in address [0xbffe0fc0]
num2=2 in address [0xbffe0fc4]
address2-address1=4
num1=1 in address [0xbffe0fac]
num2=2 in address [0xbffe0fc4]
address2-address1=24
疑问:add_normal2 中 就算short被提升为int入栈 为什么要+8才能定位要下一个地址呢?
show_test2函数 相差的怎么是24?
...全文
相关推荐
C/C++入栈顺序分析[项目代码]
在深入探讨C/C++中函数参数入栈顺序问题之前,首先需要了解在高级编程语言中,函数调用涉及到的参数传递机制。
C/C++多参数函数参数的计算顺序与压栈顺序的示例代码
C/C++标准规定,函数参数在调用时按照从右到左的顺序压入栈中。这是因为这种方式能解决一些特定问题,例如在处理不定数量参数的函数,如`printf`。
PPC和MIPS指令集下二进制代码中函数参数个数的识别方法.docx
##### 2.2 二进制函数调用特点在不同的指令集架构下,函数参数的传递方式可能会有所不同。主要存在三种传递方式:1. **栈传递**:参数通过栈来传递,需要规定参数入栈的顺序和栈的平衡方式。2.
C语言的那些小秘密之堆栈
在C语言中,函数参数的传递和局部变量的存储都依赖于栈。
【案例分析】如何分析linux下被破坏的栈
在上面的例子中,`main`函数调用`fun`函数时,返回地址`0x80484af`被压入栈中:```0xbfaf3d6C: 0x80484af <main()+37>```#### 寄存器的保存与恢复为了确保函数之间正确地传递控制权和数据


