Кроме плохой доступ при попытке вернуть 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 ответа:
&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; }