2012-01-13 105 views
2
psApdu->prgbCData = (byte_t*)malloc(APDU_BUFFER_LENGTH); 
memset((void*)psApdu->prgbCData, 0, APDU_BUFFER_LENGTH); 

byte_t prgData[] = { 0x01, 0x38, 0x00, 0x04, 0x00, 0x00, 0x00, 0x02 }; 
memcpy((byte*)psApdu->prgbCData, prgData, sizeof(prgData)); 

free(psApdu->prgbCData); 

'free'语句在此处失败。是什么原因?memcpy and free in c

+3

如何定义APDU_BUFFER_LENGTH? – Dave 2012-01-13 06:17:39

+0

你收到了什么错误信息? – 2012-01-13 06:18:33

+1

你是什么意思“失败?”它是否导致段错误? – 2012-01-13 06:18:41

回答

2

首先,你不应该往返于void *。另外sizeof是一个运营商。您需要检查sizeof prgData <= APDU_BUFFER_LENGTH。你可以使用静态断言试试这个:

psApdu->prgbCData = malloc(APDU_BUFFER_LENGTH); 
memset(psApdu->prgbCData, 0, APDU_BUFFER_LENGTH); 

byte_t prgData[] = { 0x01, 0x38, 0x00, 0x04, 0x00, 0x00, 0x00, 0x02 }; 
_Static_assert(sizeof prgData <= APDU_BUFFER_LENGTH, "too big"); 
memcpy(psApdu->prgbCData, prgData, sizeof prgData); 

free(psApdu->prgbCData); 
+2

也许你应该提到'_Static_assert'是C11,只有少数编译器才可用?此外,还有一个日常使用的宏'static_assert',它的拼写更友好一些? – 2012-01-13 07:02:14

+0

@Jens:boost包含用于非C++ 11兼容编译器的'STATIC_ASSERT',虽然我只是复制粘贴宏,使用一个marco提升是过分的... – Necrolis 2012-01-13 07:37:07

+0

@Necrolis,boost是C++,在这里,我们是在C上,我谈论的是C11而不是C++ 11。你说得对,这个功能很容易模拟,但是使用它的答案至少应该提及如何获得它。 – 2012-01-13 07:58:44

1

修改建议:

byte_t prgData[] = { 0x01, 0x38, 0x00, 0x04, 0x00, 0x00, 0x00, 0x02 }; 
    int ilen = sizeof (prgData); 
    if (ilen > APDU_BUFFER_LENGTH) { 
    printf ("ERROR: expected %d bytes, got %d\n", APDU_BUFFER_LENGTH, ilen); 
    return; 
    } 

    psApdu->prgbCData = (byte_t*)malloc(APDU_BUFFER_LENGTH); 
    if (!psApdu->prgbCData) { 
    printf ("ERROR: Unable to malloc(%d) bytes...\n", APDU_BUFFER_LENGTH); 
    return; 
    } 

    memset((void*)psApdu->prgbCData, 0, APDU_BUFFER_LENGTH); 
    memcpy((byte*)psApdu->prgbCData, prgData, sizeof(prgData)); 
    free(psApdu->prgbCData); 

ALSO: 如果你成功地分配数据,以确保没有“台阶”就可以了。问:“memset()/ memcpy()”是唯一两个更新psApdu-> prgbCData的函数吗?还有其他什么写入这个缓冲区?比如像你的颜色表或像素填充颜色到图像数组中,例如?

+0

为什么要在运行时比较常量?为什么你会麻烦检查内存失败,更不用说不返回错误值来指示失败的东西?你为什么要迂回演员? – 2012-01-14 15:27:55

+1

是非常成熟,也许你可以学到一些东西。 – 2012-01-14 17:26:18

+0

@Matt Joiner - 无论它值多少钱,我只是试图尽可能多地使用OP的原始代码,以便更好地说明应该改变的内容。它看起来像他的malloc()的“rgbData []”是一个像素数组,所以当他写入像素时,可能是* real *问题覆盖了缓冲区。具有讽刺意味的是,*我们的评论都没有真正解决实际问题。我只是想帮助。你说得对 - 我失败了。悲惨... – paulsm4 2012-01-14 18:27:09