c语言中的变长参数

来源:百度知道 编辑:UC知道 时间:2024/06/14 01:00:16
void var_args_func(const char * fmt, ... ) {
char *ap;

ap = ((char*)&fmt) + sizeof(fmt);/*只想问问这里为什么要 + sizeof(fmt) 难道这个&fmt不是4的首地址吗?*/
printf("%d\n", *(int*)ap);

ap = ap + sizeof(int);
printf("%d\n", *(int*)ap);

ap = ap + sizeof(int);
printf("%s\n", *((char**)ap));
}

int main(){
var_args_func("%d %d %s\n", 4, 5, "hello world");
}
void var_args_func(const char * fmt, ... )
函数原型里fmt就是一个指针了,所以fmt就应该是个地址了,
&fmt应该是2级地址了, sillyeeyore你为什么要说&fmt是取第一个参数的首地址呢?
你能确定你没说错吗?
我还求注释那句话的解释如果&fmt是二级指针,那么强制转化成(char *)不久指向错误的地址了?
还有即使是为什么还要加上 + sizeof(fmt) 呢?
在机器上运行sizeof(fmt)=4; 在机器上运行sizeof(fmt)=4;

你不需要考虑fmt是个什么东西, 也不要把&fmt看作是个什么“二级指针”。 你要注意的是, fmt是最左边的一个参数(唯一一个确定参数), 这样它处于栈顶(按cdecl约定),所以 &fmt实际上就是栈顶地址(这里fmt是个指针的事实是无所谓的,不管它是什么反正它的地址就是栈顶地址),逻辑上说它应该是个void*,转换成char *是为了加减方便。
栈顶地址再加上最顶上元素的size,就是下一个参数(也就是左边数第二个参数)的地址了。
写出来就是: (char*) &fmt + sizeof(fmt)

形参已经是个指针了,* fmt,那么fmt里装的就是地址?

http://www.vckbase.com/document/viewdoc/?id=1054
读读就明白了。

fmt这个已经是地址了啊 &fmt这个也是取地址不是是这个指针fmt的地址,等于**fmt,&这个表示的是取地址的运算符,与*相反的。不过有时候&这个表示引用取别名的意思。 不一样的

fmt是传入参数的地址
&fmt存放地址的地址,也就是是指针的地址。
fmt地址的内容是"%d %d %s\n"
ap = ((char*)&fmt) + sizeof(fmt); ap指向的是参数地址的地址+参数的长度。(其实也是一个内存地址),他指向的地址是4的地址的地址

printf("%d\n", *(int*)ap); 第一个输出的内容应该是4

ap = ap + sizeof(int); 这里又往后便宜一个整形长度
printf("%d\n", *(int*)ap); 这里输出是5

ap = ap + sizeof(int); 同上
printf("%s\n", *((char*