2013-05-31 36 views
0

我有一个返回一个指向结构如下功能:内存损坏

//header file 
typedef struct { 
     unsigned char *buffer; 
     uint8_t  len; 
} T_ABC_PACKET 
主文件

,我创建了一个指向函数的指针,并试图把它打印出来

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

结果在打印功能中始终保持一致。我期望缓冲区有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; 
} 

在功能打印的值是10000357f。只有最后一个字符被损坏。 这总是提供一致的值,没有多少次运行程序,只有最后一个字符在函数的调用者中被破坏。 我知道一个可能的情况是内存泄漏,但我试图仔细检查,我找不到任何泄漏。如何获得pct->缓冲区以正确使用所有内容?

+0

你是否正在为函数内的“pct”分配内存。 – Jay

+0

只是提一个问题的提示:你通常应该提供一个[简短的,独立的,可编辑的例子](http:// sscce。org /),这样人们可以最好地理解你的问题。否则,我们无法确定您发布的代码段实际上是否包含问题。 –

+0

您已删除导致问题的确切行。无论“更多初始化”是什么,它都在做非常非法的事情。请下次显示所有相关代码,包括错误的位。 –

回答

5

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

pct->buffer = strdup(string_temp); 

只要确保你检查它并没有失败:

丹尼尔·使用strdup可能是解决问题的最简单的方法建议。您当然也可以使用malloc,然后使用strcpy

+0

@Shafik Yaghmour:如果它是未定义的行为,为什么只有最后一个字符被损坏?以及我应该如何解决上述错误,以便我可以正确地获取数据包的值? – xambo

+1

@xambo“未定义的行为”意思就是:行为未定义。所以没有(对程序员来说)字节被破坏的原因。也许如果你明天运行它,所有的字节将会是。它*未定义*。 –

+0

@xambo这是未定义的行为,所以你可以对结果没有任何期望。我还更新了解决方案,可能还有其他问题,如果没有SSCCE,很难知道。 –

1

一旦你解决返回一个指针到本地的未定义行为(见沙菲克Yaghmour回答)你仍然有不确定的操作:看来缓冲区不是空ternminated,所以%s格式说明读取过去吧,只有停止当它发现一个不相关的\0

如果你知道缓冲区的长度不得超过8个,你可以在结束了复制其内容pct->len成字符缓冲区,theninsert终止:

char tmpBuf[9]; // max length is 8, plus one for null ternminator 
memcpy(tmpBuf, pct->buffer, pct->len); 
tmpBuf[pct->len] = '\0'; 
printf("value of packet is %s \n", tmpBuf); 
0

这是问题的根源:

pct->buffer = (unsigned char *)string_temp; 

'string_temp'被分配在堆栈上。当函数返回时,它会在后面的某处被销毁,或者不是,就像你的情况一样,除了最后一个字节。

您应该:

使用strdup(),而不是在该行分配。

当您完成整个结构时,请在释放整个结构之前使用free()释放该字符串。