san*_*dra 3 c malloc variadic segmentation-fault
我编写了一个可变参数C函数,其任务是为缓冲区分配所需的内存,然后sprintf在该缓冲区中给予该函数的args.但我发现它有一种奇怪的行为.它只工作一次.如果我对此功能有两次调用,则会出现段错误.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdarg.h>
char *xsprintf(char * fmt, ...)
{
va_list ap;
char *part;
char *buf;
size_t len = strlen(fmt)+1;
va_start(ap, fmt);
while (part = va_arg(ap, char *))
len += strlen(part);
va_end(ap);
buf = (char*) malloc(sizeof(char)*len);
va_start(ap, fmt);
vsprintf(buf, fmt, ap);
va_end(ap);
return buf;
}
int main(int argc, const char *argv[])
{
char *b;
b = xsprintf("my favorite fruits are: %s, %s, and %s", "coffee", "C", "oranges");
printf("size de buf is %d\n", strlen(b)); //this works. After it, it segfaults.
/*
free(b);
b = NULL;
*/
b = xsprintf("my favorite fruits are: %s, %s, and %s", "coffee", "C", "oranges");
printf("size de buf is %d\n", strlen(b));
printf("%s", b);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这是该程序的输出:
size de buf is 46
[1] 4305 segmentation fault ./xsprintftest
Run Code Online (Sandbox Code Playgroud)
难道我做错了什么?我不应该va_start在一个功能中多次使用?你有其他选择吗?非常感谢!:)
你应该使用vsnprintf.使用它两次.一旦使用NULL目标/零大小来找出您需要分配的缓冲区的长度,那么第二次填充缓冲区.这样,即使所有参数都不是字符串,您的函数也会起作用.
由于写的,如果有任何非字符串参数(它会失败%d,%x,%f,等).计算%字符数不是获取参数数量的有效方法.你的结果可能是太多(如果有文字%编码字符%%)或过少(如果还需要争论%*s,%.*d等宽/精度说明).
| 归档时间: |
|
| 查看次数: |
1020 次 |
| 最近记录: |