【发布时间】:2013-07-06 13:53:58
【问题描述】:
这是将long 转换为void * 的正确方法吗?在Qt 程序中使用-O2 时出现段错误。使用-O1时不会出现段错误。
当使用reinterpret_cast<void *>(tp.tv_nsec) 时,使用-O2 时也会出现段错误。
为什么会出现段错误?
timespec tp; // struct that holds nanoseconds since Epoch
clock_gettime(CLOCK_REALTIME, &tp); // tv_nsec is a long int
void *test = mmap((void *)(tp.tv_nsec), 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
printf("%p\n", test);
printf("%li\n", (long)test);
编辑: AFAIK,目标似乎表达错误。目标是获取一个随机数以分配一个随机内存地址。这样,每次我在整个测试程序中多次使用 mmap() 时,我都会得到一个随机内存地址。如果不是, mmap() 似乎是按顺序分配内存。
【问题讨论】:
-
当前时间和地址有什么关系?
-
你到底想干什么?无论您是否有-O1 或-O2,此段错误是否取决于您运行它的确切时间。但是我看不到目的-您是否想查看
mmap是否已安全实现,以便如果您获取random地址并将其输入,它将做正确的事情,或者您为什么要这样做?