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调用约定。求原因?