我找到了以下答案:将void* 转换为double然而,我得到了分割故障。为什么会这样?代码:
void * p = (void *) 1234;double n = *(double *)p;
void * p = (void *) 1234;
double n = *(double *)p;
7y4bm7vi1#
指针p被分配给你随机选择的地址1234?*.然后引用一个 * 随机 * 地址。它不对应于有效的已分配内存块。
p
dl5txlt92#
你找到的答案假设你有一个void*,它实际上指向一个double,例如。
void*
double original = 3.0;void* p = (void*) &original;
double original = 3.0;
void* p = (void*) &original;
您的void*指向一个相当随机的内存位。
sg2wtvxw3#
您链接到的页面中的代码中的num是一个指针,而不是任意的整数值。它被声明为void *num,接受的答案中的代码将它从一种类型的指针(void *)转换为另一种类型的指针(int *)。您正试图将任意整数转换为指针。除非该整数是进程内存空间中的某个地址,否则在C实现的整数到指针转换所使用的格式中,您不应该期望将其转换为指针以生成有用的指针。虚拟内存空间是巨大的今天,一个简单的程序只使用一小部分的空间,所以大部分的地址不Map到实际的内存,并试图使用它们的结果段故障或类似的错误。特别是,内存的第一页(通常为4096字节)可能故意未使用,因此试图访问地址0会出错。这会导致错误地使用空指针(由于错误)的程序得到错误,而不是使用来自该地址的不正确数据。这是首选的,因为它可以更快地发现bug。由于1234位于第一页内,因此它未Map到有效内存。
num
void *num
void *
int *
3条答案
按热度按时间7y4bm7vi1#
指针
p
被分配给你随机选择的地址1234?*.然后引用一个 * 随机 * 地址。它不对应于有效的已分配内存块。dl5txlt92#
你找到的答案假设你有一个
void*
,它实际上指向一个double,例如。您的
void*
指向一个相当随机的内存位。sg2wtvxw3#
您链接到的页面中的代码中的
num
是一个指针,而不是任意的整数值。它被声明为void *num
,接受的答案中的代码将它从一种类型的指针(void *
)转换为另一种类型的指针(int *
)。您正试图将任意整数转换为指针。除非该整数是进程内存空间中的某个地址,否则在C实现的整数到指针转换所使用的格式中,您不应该期望将其转换为指针以生成有用的指针。
虚拟内存空间是巨大的今天,一个简单的程序只使用一小部分的空间,所以大部分的地址不Map到实际的内存,并试图使用它们的结果段故障或类似的错误。
特别是,内存的第一页(通常为4096字节)可能故意未使用,因此试图访问地址0会出错。这会导致错误地使用空指针(由于错误)的程序得到错误,而不是使用来自该地址的不正确数据。这是首选的,因为它可以更快地发现bug。由于1234位于第一页内,因此它未Map到有效内存。