最后一个字节中的内存损坏

xam*_*mbo 0 c

我有一个函数返回指向结构的指针,如下所示:

//header file
typedef struct {
        unsigned char *buffer;
        uint8_t       len;
} T_ABC_PACKET
Run Code Online (Sandbox Code Playgroud)

在主文件中,我创建一个指向函数的指针并尝试打印它

T_ABC_PACKET *pct = NULL;
pct = function_that_return_the_packet;
printf("value of packet is %s \n", pct->buffer);
Run Code Online (Sandbox Code Playgroud)

结果始终与打印功能一致.我希望缓冲区有一个8字节,最后一个字节总是一个损坏的内存. 值是10000357` 2U

但如果我在函数内打印缓冲区:

T_ABC_PACKET* function_that_return_the_packet {

T_ABC_PACKET *pct = NULL;
char string_temp[80];
//some more initialization...
pct->buffer = (unsigned char *)string_temp;
pct->len = 5;
printf("value of packet is %s \n", pct->buffer);
return pct;
}
Run Code Online (Sandbox Code Playgroud)

函数中打印的值为10000357f.只有最后一个字符被破坏.这总是提供一致的值,没有多次我运行程序,只有最后一个字符在函数的调用者中被破坏.我理解一个可能的情况是内存泄漏,但我试着仔细检查,我找不到任何泄漏.如何让pct->缓冲区正确包含所有内容?

Sha*_*our 5

看起来您正在返回一个指向本地变量的指针,该变量是未定义的行为,string_temp是本地的,function_that_return_the_packet并且在退出该函数后将不存在.

正如Daniel建议使用strdup可能是解决问题的最简单方法:

pct->buffer = strdup(string_temp);
Run Code Online (Sandbox Code Playgroud)

只要确保你检查它没有失败.你当然也可以使用malloc然后strcpy.