Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
char*的大小是否与int*的大小相同?_C_Pointers_Assembly_Dereference - Fatal编程技术网

char*的大小是否与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上 注:我知道类型转换不是编码的建议方式。但

我知道: 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位的体系结构。