尝试制作随机__uint128_t数组失败
我是 C 的新手,正在尝试制作一个包含一百万个随机数__uint128_t的数组。这是我失败的尝试:
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <inttypes.h>
#include <time.h>
#include <string.h>
void print128(__uint128_t u) {
if (u>9) print128(u/10);
putchar(48+(int)(u%10));
}
typedef __uint128_t u128;
uint64_t wyhash64_x;
uint64_t wyhash64() {
wyhash64_x += 0x60bee2bee120fc15;
__uint128_t tmp;
tmp = (__uint128_t) wyhash64_x * 0xa3b195354a39b70d;
uint64_t m1 = (tmp >> 64) ^ tmp;
tmp = (__uint128_t)m1 * 0x1b03738712fad5c9;
uint64_t m2 = (tmp >> 64) ^ tmp;
return m2;
}
int main() {
u128 vals128[1000000];
u128 lower;
u128 higher;
for (int i = 0; i < 1000000; i++) {
lower = (u128) wyhash64();
higher = (u128) wyhash64();
higher = higher << 64;
vals128[i] = lower + higher;
}
print128(vals128[0]);
printf("n");
}
当我运行它时,它编译时没有警告,但会出现段错误。
我究竟做错了什么?
回答
在本地声明大小超过 1,048,576 字节的数组是一个坏主意,因为堆栈大小通常为 1,048,576 (2^20)。
相反,使用 u128* vals128 = malloc(1000000 * sizeof(*vals128));