a905448839 发表于 2023-4-19 22:53:58

这个代码为什么在32位架构和64位架构下不一样?

问题1:这个代码为什么在32位架构和64位架构下不一样?
问题2:        printf("%lu\n",sizeof(&i)); 这一句是啥意思?打印的i的地址值的空间大小?i的地址的值是什么类型?(是指针类型?还是十六进制的整形类型?)
问题3:为什么在64位架构下 i是int类型 &i的空间大小是8但是int类型是4字节啊 i是一个int类型啊!难道这个&i是一个指针?
#include<stdio.h>

int main(void)
{
        int i = 0;
        int p;
        p = (int)&i;
        printf("%x\n",p);
        printf("%p\n",&i);
        printf("%lu\n",sizeof(int));
        printf("%lu\n",sizeof(&i));
       
        return 0;
}

isdkz 发表于 2023-4-19 22:58:11

问题1:这个代码为什么在32位架构和64位架构下不一样?

答:因为32位架构和64位架构的指针大小不同。在32位架构下,指针通常是4个字节,而在64位架构下,指针通常是8个字节。因此,在不同架构下运行这段代码可能会导致不同的输出。

问题2:printf("%lu\n",sizeof(&i)); 这一句是啥意思?打印的i的地址值的空间大小?i的地址的值是什么类型?(是指针类型?还是十六进制的整形类型?)

答:这一句代码的意思是打印&i的大小。&i是一个指向i的指针,表示i的内存地址。sizeof(&i)计算的是这个指针所占用的内存大小。&i是一个指针类型,具体类型是int *,即指向整数的指针。

问题3:为什么在64位架构下 i是int类型 &i的空间大小是8 但是int类型是4字节啊 i是一个int类型啊! 难道这个&i是一个指针?

答:i是一个int类型,确实占用4个字节。但&i表示的是i的内存地址,是一个指向i的指针。在64位架构下,指针大小通常是8个字节。所以,&i的大小是8,这是因为它是一个指针,而不是int类型。

这段代码的输出如下:


[*]以十六进制形式打印p(即将&i强制转换为int类型后的值)。
[*]以指针形式打印&i(即i的内存地址)。
[*]打印int类型的大小(通常是4个字节)。
[*]打印&i的大小,即指向i的指针所占用的内存大小(在64位架构下通常是8个字节)。
页: [1]
查看完整版本: 这个代码为什么在32位架构和64位架构下不一样?