C语言 将void * 转换为双重分段故障

nhjlsmyf  于 2023-10-16  发布在  其他
关注(0)|答案(3)|浏览(154)

我找到了以下答案:将void* 转换为double
然而,我得到了分割故障。为什么会这样?
代码:

  1. void * p = (void *) 1234;
  2. double n = *(double *)p;
7y4bm7vi

7y4bm7vi1#

指针p被分配给你随机选择的地址1234?*.然后引用一个 * 随机 * 地址。它不对应于有效的已分配内存块。

dl5txlt9

dl5txlt92#

你找到的答案假设你有一个void*,它实际上指向一个double,例如。

  1. double original = 3.0;
  2. void* p = (void*) &original;

您的void*指向一个相当随机的内存位。

sg2wtvxw

sg2wtvxw3#

您链接到的页面中的代码中的num是一个指针,而不是任意的整数值。它被声明为void *num,接受的答案中的代码将它从一种类型的指针(void *)转换为另一种类型的指针(int *)。
您正试图将任意整数转换为指针。除非该整数是进程内存空间中的某个地址,否则在C实现的整数到指针转换所使用的格式中,您不应该期望将其转换为指针以生成有用的指针。
虚拟内存空间是巨大的今天,一个简单的程序只使用一小部分的空间,所以大部分的地址不Map到实际的内存,并试图使用它们的结果段故障或类似的错误。
特别是,内存的第一页(通常为4096字节)可能故意未使用,因此试图访问地址0会出错。这会导致错误地使用空指针(由于错误)的程序得到错误,而不是使用来自该地址的不正确数据。这是首选的,因为它可以更快地发现bug。由于1234位于第一页内,因此它未Map到有效内存。

相关问题