c 中的 memcpy 和 free

SHR*_*HRI 2 c

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);
Run Code Online (Sandbox Code Playgroud)

“免费”声明在这里失败了。是什么原因?

Mat*_*ner 5

首先,您不应该在 和 之间进行投射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);
Run Code Online (Sandbox Code Playgroud)

  • 也许你应该提到 `_Static_assert` 是 C11 并且仅在少数编译器中可用,但是?另外,有一个日常使用的宏“static_assert”,其拼写对用户更友好吗? (2认同)