2

EXC_BAD_ACCESSこの関数の結果をログに記録しようとすると、エラーが発生し続けますか? 私は何を間違っていますか?

-(uint64_t) rand64bitNum {
    uint32_t left = arc4random();
    uint32_t right = arc4random();
    uint64_t randNum = 0;
    memcpy(&randNum, &left, sizeof(left));
    uint16_t offset = sizeof(left);
    memcpy(&randNum+offset, &right, sizeof(right));
    return randNum;
}
4

2 に答える 2

4

メモリ エラーの説明は @OliCharlesworth の回答に記載されていますがmemcpy、まったく必要のないより良い解決策を提示したかったのです。

- (uint64_t)rand64bitNum
{
    uint64_t left = arc4random();
    uint64_t right = arc4random();
    uint64_t randNum = (right << 32) | left;
    return randNum;
}

たぶんさらに良く、(ほとんど)エラーの余地を残さずに、次を使用できますarc4random_buf(3)

- (uint64_t)rand64bitNum
{
    uint64_t randNum;
    arc4random_buf(&randNum, sizeof randNum);
    return randNum;
}
于 2013-05-26T19:02:54.960 に答える
4

&randnum+offsetあなたが思っていることをしません。ポインタ加算は、指しているモノ単位で行われます。したがって、おそらく必要です(char *)&randnum + offset

于 2013-05-26T18:59:46.737 に答える