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