Is the sizeof(some pointer) always equal to four?

前端 未结 17 1185
温柔的废话
温柔的废话 2020-11-22 11:49

For example: sizeof(char*) returns 4. As does int*, long long*, everything that I\'ve tried. Are there any exceptions to this?

相关标签:
17条回答
  • 2020-11-22 12:33

    In general, sizeof(pretty much anything) will change when you compile on different platforms. On a 32 bit platform, pointers are always the same size. On other platforms (64 bit being the obvious example) this can change.

    0 讨论(0)
  • 2020-11-22 12:35

    No, the size of a pointer may vary depending on the architecture. There are numerous exceptions.

    0 讨论(0)
  • 2020-11-22 12:37

    Just another exception to the already posted list. On 32-bit platforms, pointers can take 6, not 4, bytes:

    #include <stdio.h>
    #include <stdlib.h>
    
    int main() {
        char far* ptr; // note that this is a far pointer
        printf( "%d\n", sizeof( ptr));
        return EXIT_SUCCESS;
    }
    

    If you compile this program with Open Watcom and run it, you'll get 6, because far pointers that it supports consist of 32-bit offset and 16-bit segment values

    0 讨论(0)
  • 2020-11-22 12:37

    The size of the pointer basically depends on the architecture of the system in which it is implemented. For example the size of a pointer in 32 bit is 4 bytes (32 bit ) and 8 bytes(64 bit ) in a 64 bit machines. The bit types in a machine are nothing but memory address, that it can have. 32 bit machines can have 2^32 address space and 64 bit machines can have upto 2^64 address spaces. So a pointer (variable which points to a memory location) should be able to point to any of the memory address (2^32 for 32 bit and 2^64 for 64 bit) that a machines holds.

    Because of this reason we see the size of a pointer to be 4 bytes in 32 bit machine and 8 bytes in a 64 bit machine.

    0 讨论(0)
  • 2020-11-22 12:37

    Just for completeness and historic interest, in the 64bit world there were different platform conventions on the sizes of long and long long types, named LLP64 and LP64, mainly between Unix-type systems and Windows. An old standard named ILP64 also made int = 64-bit wide.

    Microsoft maintained LLP64 where longlong = 64 bit wide, but long remained at 32, for easier porting.

    Type           ILP64   LP64   LLP64
    char              8      8       8
    short            16     16      16
    int              64     32      32
    long             64     64      32
    long long        64     64      64
    pointer          64     64      64
    

    Source: https://stackoverflow.com/a/384672/48026

    0 讨论(0)
  • 2020-11-22 12:41

    8 bit and 16 bit pointers are used in most low profile microcontrollers. That means every washing machine, micro, fridge, older TVs, and even cars.

    You could say these have nothing to do with real world programming. But here is one real world example: Arduino with 1-2-4k ram (depending on chip) with 2 byte pointers.

    It's recent, cheap, accessible for everyone and worths coding for.

    0 讨论(0)
提交回复
热议问题