char*的大小是否与int*的大小相同?
我知道: char*是指向char的指针。 和 int*是指向int的指针 因此,我想确认以下两件事:char*的大小是否与int*的大小相同?,c,pointers,assembly,dereference,C,Pointers,Assembly,Dereference,我知道: char*是指向char的指针。 和 int*是指向int的指针 因此,我想确认以下两件事: 现在假设我在32位机器上,这意味着内存地址是32位宽的。 所以这意味着char*和int*的大小都是32位(4字节),对吗? 字符**的大小是否与int*的大小相同 假设我有: int*ptr 所以现在做*((char**)ptr)=0x154和*((int*)ptr)=0x514是一样的,对吗? (0x514只是任意随机内存地址) 平台:我在x86上 注:我知道类型转换不是编码的建议方式。但
注:我知道类型转换不是编码的建议方式。但是我在做内核编码,所以我必须做类型转换 从技术上讲,C标准只保证sizeof(char)==1,其余由实现决定。但在现代x86体系结构(如Intel/AMD芯片)上,这是相当可预测的 您可能听说过处理器被描述为16位、32位、64位等。这通常意味着处理器使用N位作为整数。由于指针存储内存地址,而内存地址是整数,这有效地告诉您指针将使用多少位。sizeof通常以字节为单位,因此为32位处理器编译的代码将报告指针大小为4(32位/8位/字节),而为64位处理器编译的代码将报告指针大小为8(64位/8位/字节)。这就是32位处理器4GB内存限制的来源——如果每个内存地址对应一个字节,那么要寻址更多内存,需要大于32位的整数 实际上,16位系统上的指针大小为2(如果可以找到的话),32位系统上的指针大小为4,64位系统上的指针大小为8,但是依赖C中给定的大小并没有什么好处。现在在现实中,大多数实现指针的大小都是相同的,但这是编译器的实现细节 从: 旧的HP 3000系列对字节使用不同的寻址方案 地址比单词地址更重要;就像上面的几台机器一样 因此,它对char*和void使用不同的表示* 指针,而不是其他指针 根据使用的“内存型号”,8086系列处理器(PC 兼容)可使用16位数据指针和32位函数 指针,反之亦然
另外,
*((char*)ptr)=0x154
与*((int*)ptr)=0x154
不同。由于您正在取消对指针的引用,因此您将把char
大小和int
大小的数据写入ptr
指向的位置。假设一个8位字符和一个32位整数,*((char*)ptr)=0x154
将0x154
写入分配给ptr
的内存地址,*((int*)ptr)=0x154
将0x0000000154
写入分配给ptr的地址开始的4个字节,即使标准没有说明,我怀疑找到一个实际不同的环境是否容易。虽然它们的大小在实践中是相同的,但它们的对齐要求却不同。如果您正在进行“内核编码”,这已经限制了代码可以运行的平台数量。检查操作系统规范支持什么。回答简短但链接很棒。我建议在你的答案中加入最有趣的一句话,例如“旧的、字寻址的素数机器也因为需要比字指针(int*)更大的字节指针(char*)而臭名昭著。”@user1599964我假设这是一个打字错误,因为在您的示例中有不同的值-转换为char**
或int*
意味着非常不同的东西,不能直接进行比较。它们是不同级别的间接寻址,甚至不接近执行相同的操作。@user1599964我考虑过更多的间接寻址,您的两个语句相当于sizeof(char*)==sizeof(int)
。因此,一个具有32位指针和32位int的系统,它们都将写入同一个位置。这一切都很好,直到您运行到一个36位或48位的体系结构。