将void*转换为double时触发Segmentation Fault,原因是什么?
为什么这段代码会出现Segmentation Fault?
你的代码出现段错误的核心原因是访问了非法内存地址:
- 代码里
void * p = (void *) 1234;是把整数1234强制转换成了指针地址,这个地址(十六进制为0x4D2)属于操作系统保留或程序无权访问的内存区域。 - 后续
double n = *(double *)p;试图从这个非法地址读取8字节(double类型的字节数)数据,直接触发了操作系统的内存保护机制,因此抛出Segmentation Fault。
正确的处理方式
如果只是想把整数1234转换成double类型,完全不需要指针操作,直接做类型转换即可:
// 直接赋值或转换 double n = 1234.0; // 或者从整数变量转换 int num = 1234; double n = (double)num;
如果确实需要通过void*传递double数据,要让指针指向合法的double变量地址:
double val = 1234.0; void *p = &val; double n = *(double *)p;
内容的提问来源于stack exchange,提问作者Mary
相关产品推荐
相关产品推荐

