ogs*_*ogs 0 c string printf concatenation
我试图通过连接一些值来逐个构建一个字符串,以获得类似的东西:
|0x0F64:0x0063:0x1A|0x7CC4:0x0073:0x1A|0x0A51:0xA29A:0x9C|0xD49D:0x0058:0x10|
Run Code Online (Sandbox Code Playgroud)
我想使用动态变量,因为NB_ELEMENT可能会得到改进.
#include <stdio.h>
#include <stdlib.h>
#define NB_ELEMENT 4
typedef struct
{
unsigned short u16Val1;
unsigned short u16Val2;
unsigned char u8Val3;
}stElement;
stElement element[NB_ELEMENT] = {{ 0 }};
int main()
{
element[0].u16Val1 = 3940;
element[0].u16Val2 = 99;
element[0].u8Val3 = 26;
element[1].u16Val1 = 31940;
element[1].u16Val2 = 115;
element[2].u8Val3 = 26;
element[2].u16Val1 = 2641;
element[2].u16Val2 = 41620;
element[2].u8Val3 = 156;
element[3].u16Val1 = 52429;
element[3].u16Val2 = 88;
element[3].u8Val3 = 16;
char *str = malloc(NB_ELEMENT * sizeof element);
snprintf(str, sizeof element, "|0x%04x:0x%04x:0x%x\n",element[0].u16Val1,
element[0].u16Val2,
element[0].u8Val3);
str += sprintf(str, "|0x%04x:0x%04x:0x%x\n",element[1].u16Val1,
element[1].u16Val2,
element[1].u8Val3);
fprintf(stdout, "%s\n", str);
free(str);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
上面的代码返回:
*** Error in `./TEST': free(): invalid pointer: 0x0000000000cac023 ***
Run Code Online (Sandbox Code Playgroud)
但是,我设法打印|0x0f64:0x0063:0x1a但是avec添加str + = sprintf ..,发生错误.
问题出在这里:
str += sprintf(str, "|0x%04x:0x%04x:0x%x\n",element[1].u16Val1,
element[1].u16Val2,
element[1].u8Val3);
Run Code Online (Sandbox Code Playgroud)
这会修改指针str.因此,当你把它交给free以后,它不是malloc给你的指针,这使得free工作变得相当困难.
解决方案:不要修改指针.如果要通过添加写入指针的字符数来跟踪缓冲区中的位置,请使用不同的指针:
char *str = malloc(NB_ELEMENT * sizeof element);
// ...
char * p = str;
// ...
p += sprintf(p, "|0x%04x:0x%04x:0x%x\n",element[1].u16Val1,
element[1].u16Val2,
element[1].u8Val3);
// ...
free(str);
Run Code Online (Sandbox Code Playgroud)