va_copy

 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);就没有产生错误,因为能力有限,具体的原理还不是很清楚,希望帮助你理解

原文地址:https://www.cnblogs.com/chuanyang/p/5534049.html