c - free() 提示无效指针

标签 c string printf concatenation

我试图通过连接一些值来在我的程序中逐段构建一个字符串,以获得类似的内容:

|0x0F64:0x0063:0x1A|0x7CC4:0x0073:0x1A|0x0A51:0xA29A:0x9C|0xD49D:0x0058:0x10|

我想使用动态变量,因为 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;
}

上面的代码返回:

*** Error in `./TEST': free(): invalid pointer: 0x0000000000cac023 ***

但是,我设法打印了 |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);

修改 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);

关于c - free() 提示无效指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40682545/

相关文章:

c - a+=b 和 a=a+b 之间的性能差异

string - 日期与字符串操作 Swift 2 最佳实践

c++ - 如何在出现特定字符后跳过字符串中的所有字符

python - 识别包含数字和字符串的 pandas 数据框列

c - 执行c程序时显示"Abnormal program termination"

c++ - 用于 Motif 库(C)的水平绘制的 RowColumn 类?

c - 动态数组和预建数据

c++ - 为什么我的代码中的fprintf()函数无法正常工作?

c++ - GCC printf 优化

可以传递非字符串文字的c函数strftime创建一个不受控制的格式字符串漏洞