2012-01-13 61 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