Кроме плохой доступ при попытке вернуть uint64 в Т


Я продолжаю получать 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;
}
2 2

2 ответа:

&randnum+offset не делает того, что вы думаете, что он делает; добавление указателя выполняется в единицах объекта, на который он указывает. Так что вы, вероятно, хотите (char *)&randnum + offset.

Объяснение вашей ошибки памяти дано в ответе @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;
}