C 编译器为限制指针指向的内存而采取的操作

C 编译器为限制指针指向的内存而采取的操作,c,C,在这段代码中(暂时不使用严格的别名): #包括 内部主(空) { int i=10; void*ptr=&i; printf(“%lu\n”,sizeof(ptr)); printf(“%d\n”,*(int*)ptr); 返回0; } 它将sizeof(void*)表示为8,但在将其键入int*后取消引用时,它会精确地打印分配给变量i的数字 编译器如何推动/限制大小为8字节的指针指向下一个4字节(sizeof(int)在我的系统上)?我认为8字节是为了将“I”(int I=10;)的地

在这段代码中(暂时不使用严格的别名):

#包括
内部主(空)
{   
int i=10;
void*ptr=&i;
printf(“%lu\n”,sizeof(ptr));
printf(“%d\n”,*(int*)ptr);
返回0;
}
它将
sizeof(void*)
表示为8,但在将其键入
int*
后取消引用时,它会精确地打印分配给变量i的数字


编译器如何推动/限制大小为8字节的指针指向下一个4字节(
sizeof(int)
在我的系统上)?

我认为8字节是为了将“I”(int I=10;)的地址保存在内存中,所以这并不意味着要保存什么类型的数据,它只保存地址内存位置,需要8个字节来适应任何需要强制转换的数据类型

我认为8个字节是为了保存内存中“I”(int I=10;)的地址,所以它并不意味着要保存什么样的数据,它只保存地址内存位置,需要8个字节才能适合任何需要强制转换的数据类型

是否希望
int i[2]={0,42};void*p=i;printf(“%d\n”,*((int*)p)+1)
@pmg我只想得到一张内部发生的事情的粗略地图。“编译器如何将大小为8个字节的指针推/限制为指向下一个4个字节(我的系统上的int大小)”系统上指针的大小与它指向的对象的大小无关。我不完全清楚你在问什么。您希望它打印其他内容吗?这里没有严格的别名问题,您希望
inti[2]={0,42};void*p=i;printf(“%d\n”,*((int*)p)+1)
@pmg我只想得到一张内部发生的事情的粗略地图。“编译器如何将大小为8个字节的指针推/限制为指向下一个4个字节(我的系统上的int大小)”系统上指针的大小与它指向的对象的大小无关。我不完全清楚你在问什么。你希望它打印其他东西吗?这里没有严格的别名问题
 #include<stdio.h>

 int main(void)
 {   
     int i=10;
     void *ptr=&i;
     printf("%lu\n",sizeof(ptr));
     printf("%d\n",*(int *)ptr);
     return 0;
 }