我对C还不太熟悉,可以自由地接受教育。。。
我正在使用一个函数,它需要一个指向char数组的指针作为输入。在调用数组之前单独设置数组的每个元素是相当麻烦的。我已经找到了两个看似可行的替代方案,但我担心自己正陷入一个陷阱。下面是几个选择。
选项1:

 unsigned char DataToPass[8];
 uint64_t *IntPtr = (uint64_t *)DataToPass;
   ...
 *IntPtr = 0x1122334455667788;
 FunctionCall(DataToPass);

选择2:
unsigned char DataToPass[8];
uint64_t IntData;
...
iDataToPass = 0x1122334455667788;
memcpy(DataToPass, &IntData, sizeof(IntData);
FunctionCall(DataToPass);

最佳答案

示例1可能由于违反对齐而导致未定义的行为。它还违反了严格的别名规则,从而导致UB。
示例2不会导致UB,但是它有实现定义的结果。DataToPass[0] >在普通系统上是0x88,但0x110x55也存在,事实上任何事情都是可能的。
我的建议是编写清楚表达您意图的代码:

unsigned char DataToPass[8] = { 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88 };

你要花10秒打字,但会省下很多痛苦。

09-08 00:48