C语言函数参数入栈顺序问题
#include <stdio.h>
void va_test(char *fmt, ...); //参数可变的函数声明
void main()
{
int a = 1, c = 55;
char b = 'b';
va_test("hello,world", a, b, c);
}
void va_test(char *fmt, ...)
{
//char buf[128];
char *p = NULL;
p = (char *) &fmt;
int i;
for (i = 0; i < 16; i++)
{
printf("%.4d ", *p);
p++;
}
}
可变参数的入栈顺序问题,一开始注释掉char buf[128];这条语句,用gdb(ubuntu 10.10下写的)调试结果为:
(gdb) p &fmt
$1 = (char **) 0xbffff320
(gdb) x/4xw 0xbffff320
0xbffff320: 0x08048510 0x00000001 0x00000062 0x00000037
可见确实是C调用约定,由于对齐,字符占4个字节。但当不注释掉char buf[128]时,用gdb调试结果为:
(gdb) p &fmt
$1 = (char **) 0xbffff27c
(gdb) x/4xw 0xbffff27c
0xbffff27c: 0x080485a0 0x00000000 0x00000000 0xbffff27c
后面参数不是传进来的 a, b, c.似乎不符合C调用约定。求原因?
void va_test(char *fmt, ...); //参数可变的函数声明
void main()
{
int a = 1, c = 55;
char b = 'b';
va_test("hello,world", a, b, c);
}
void va_test(char *fmt, ...)
{
//char buf[128];
char *p = NULL;
p = (char *) &fmt;
int i;
for (i = 0; i < 16; i++)
{
printf("%.4d ", *p);
p++;
}
}
可变参数的入栈顺序问题,一开始注释掉char buf[128];这条语句,用gdb(ubuntu 10.10下写的)调试结果为:
(gdb) p &fmt
$1 = (char **) 0xbffff320
(gdb) x/4xw 0xbffff320
0xbffff320: 0x08048510 0x00000001 0x00000062 0x00000037
可见确实是C调用约定,由于对齐,字符占4个字节。但当不注释掉char buf[128]时,用gdb调试结果为:
(gdb) p &fmt
$1 = (char **) 0xbffff27c
(gdb) x/4xw 0xbffff27c
0xbffff27c: 0x080485a0 0x00000000 0x00000000 0xbffff27c
后面参数不是传进来的 a, b, c.似乎不符合C调用约定。求原因?
...全文
相关推荐
C/C++入栈顺序分析[项目代码]
在深入探讨C/C++中函数参数入栈顺序问题之前,首先需要了解在高级编程语言中,函数调用涉及到的参数传递机制。
C/C++多参数函数参数的计算顺序与压栈顺序的示例代码
C/C++标准规定,函数参数在调用时按照从右到左的顺序压入栈中。这是因为这种方式能解决一些特定问题,例如在处理不定数量参数的函数,如`printf`。
C语言的那些小秘密之堆栈
在C语言中,函数参数的传递和局部变量的存储都依赖于栈。
C语言函数调用约定.doc-综合文档
在C语言中,当函数被调用时,调用者负责将参数按照特定的顺序压入栈中,以便被调用函数可以从栈中取得这些参数进行相应的计算处理。
关于C和C++中函数的调用约定.doc
函数调用约定定义了函数参数如何入栈、谁负责清理栈帧,以及如何处理返回值。C和C++中常见的调用约定包括:1. **__cdecl**:这是C/C++编译器的默认约定,也是C语言的标准调用约定。


