int save_prt(int type,int mode,const char*pFormat,...) { va_list args; char *pCpyTmp = NULL; unsigned int writeLen = 0; unsigned int maxLen = 10*1024;\ const char *curMsg=0; pCpyTmp = (void*)malloc(maxLen); printf("sssssssssssssssssssssssssss\n\n"); va_start(args, pFormat); printf("writeLen %d pCpyTmp %p pFormat %s end(%p)\n",writeLen,pCpyTmp,pFormat,pFormat); /*使用va_arg遍历*/ for(curMsg = pFormat ; curMsg!=0 ; curMsg = va_arg(args, const char*)) { printf("%s", curMsg); } printf("eeeeeeeeeeeeeeeeeeeeeeeeeee\n\n"); writeLen = vsnprintf(pCpyTmp,maxLen,pFormat, args); va_end(args); printf("writeLen %d pCpyTmp %s\n",writeLen,pCpyTmp); return 0; } int main() { float speed = 25.0; unsigned short veh_speed = 15; float carSpeed = 50.0; char pr[32] = "abc123456"; save_prt(1,0,"speed %d %d %f pr=%s\n", speed,veh_speed,carSpeed,pr); return 0; }这段代码为啥会运行崩溃?
时间: 2024-01-14 17:02:12 浏览: 20
这段代码会运行崩溃的原因是在调用 vsnprintf 函数之前,没有将可变参数列表 va_list 完全遍历一遍,导致获取参数时出现了不确定的错误。具体来说,以下两行代码存在问题:
```
for(curMsg = pFormat ; curMsg!=0 ; curMsg = va_arg(args, const char*))
{
printf("%s", curMsg);
}
```
```
writeLen = vsnprintf(pCpyTmp,maxLen,pFormat, args);
```
在第一段代码中,curMsg 的初始值为 pFormat,每次执行时调用 va_arg 函数获取下一个参数,直到获取到空指针,表示遍历完了所有的参数。但是,在第二段代码中,vsnprintf 函数在获取参数时,需要从 va_list 的当前位置开始获取,而不是从头开始遍历。由于第一段代码并没有将 va_list 遍历完全,因此在执行第二段代码时,可能会获取到一些未知的参数,导致程序崩溃。要解决这个问题,可以在第一段代码中将 va_list 遍历完全,或者将 va_list 复制一份,在第二段代码中使用复制后的 va_list。
相关问题
自定义函数实现整数数组前n个元素的输出,函数原型为 void arr_prt(int * p,int n)。
下面是实现整数数组前n个元素输出的自定义函数arr_prt,函数原型为 void arr_prt(int * p,int n):
```c
#include <stdio.h>
void arr_prt(int *p, int n)
{
int i;
for (i = 0; i < n; i++)
printf("%d ", *(p + i));
printf("\n");
}
int main()
{
int arr[] = {1, 2, 3, 4, 5};
arr_prt(arr, 3); // 输出前3个元素
return 0;
}
```
在上面的代码中,我们定义了一个arr_prt函数,它接受一个整数指针和一个整数作为参数,分别代表整数数组的首地址和要输出的元素个数。然后,我们使用for循环遍历整数数组的前n个元素,并使用printf函数将它们输出到屏幕上。最后,我们在主函数中调用这个函数,并传递整数数组的首地址和要输出的元素个数作为参数。
以下程序有语法性错误,有关错误原因的正确说法是:( ) int main() { int G=5,k; void prt_char(); …… k=prt_char(G); …… }
以下程序中的语法错误是函数声明的语法错误。
在函数声明时,应该指定函数的返回类型。但是,在这个函数声明中,返回类型为void,这是不正确的。应该指定函数的返回类型为int或其他类型。修正后的函数声明应该是:
```c
int prt_char(int);
```
这样就可以将函数声明正确地指定为返回int类型。