1 #include <stdio.h>
2 #include <stdarg.h>
3
4 void func(char* format, va_list ptr);
5 void print(char* format,...);
6
7 void print(char* format,...)
8 {
9 va_list ptr;
10 va_list ptr_tmp;
11 va_start(ptr, format);
12
13 va_copy(ptr_tmp,ptr);
14
15 printf("print ptr: %p,%p
",format, ptr);
16
17 vfprintf(stdout, format, ptr);
18 vfprintf(stdout, format, ptr);
19 //vfprintf(stdout, format, ptr_tmp);
20
21 va_end(ptr);
22 }
23
24 int main()
25 {
26 int i=3,j=4;
27 char a[20]="hello world";
28 print("aaaaasdfas"
29 "%d,%d,%s
",i,j,a);
30 return 0;
31 }
在print函数中,调用了两次vfprintf,在使用第二个vfprintf时出现:Segmentation fault
先看va_list的结构,在我的关于va_list问题博客中已经说明,http://www.cnblogs.com/chuanyang/p/5533927.html
发生段错误的原因是fp_offset和gp_offset发生了改变,如下图,所以使用va_copy,再调用一次vfprintf(stdout, format, ptr_tmp);就没有产生错误,因为能力有限,具体的原理还不是很清楚,希望帮助你理解