C/C++中的内存分配

memory allocation in C/C++

本文关键字:内存 分配 C++      更新时间:2023-10-16

当您在C或C++中声明int类型的变量x时,我知道它将占用4字节的内存。因此,为该变量分配了4个内存地址。我的问题是,我能看到分配给这个变量的所有四个内存地址吗?我知道这不是一个典型的问题,但我很好奇。或者它100%总是仅仅是存储器地址&x和接下来的3位?所以,如果它是内存地址1000,那么下一个将是1001、1002和1003?它是否偏离了这一点?

也可以说我设置x=5;

这是否意味着在这个存储器位置1000到1002中,它将被零填充,而在1003中,在最右边的位置有一个101(5的二进制表示)?

感谢

int可以是四个字节,但这实际上取决于编译器。因此,为什么会有特定的大小类型,如uint32_t。但为了论证起见,我们假设您的int是四个字节。

是的,这四个字节是连续的。因此,&x和接下来的三个字节是变量的位置,这是正确的。

然而,您假设最右边的字节是最不重要的,这只适用于big-endian机器。在小端序体系结构(如x86)上,最左边的字节将包含101来表示数字5。

int的大小并不总是4个字节,只知道

char <= short <= int <= long <= long long

你可以像这个一样遍历int的每个字节

#include <stdio.h>
void main() {
    int A = 10;
    int *intPtr;
    char *charPtr;
    size_t size = sizeof(int);
    size_t i;
    intPtr = &A;
    printf("%dn", *intPtr);
    charPtr = (char*) intPtr;
    for (i = 0; i < size; i++) {
        printf("%dn", *(charPtr++));
    }
}

几个不准确之处:

  1. int的大小取决于平台(尽管在大多数情况下它实际上是4个字节)。

  2. 你说的"看地址"是什么意思?如果你想通过调试器观察它,那么就继续吧,你很可能也会看到相邻的地址。如果您想访问int变量中的特定地址,那么可以使用char指针轻松访问:

    int x = 5;

    char* p = (char*)&x;

    您可以使用p[i]访问0<=i<=sizeof(int)-1范围内的任何地址。

  3. 地址1000-1003的内容取决于底层硬件架构的端序:

    • 在Big Endian处理器上,内容(从低地址到高地址)将为0 0 5
    • 在Little Endian处理器上,内容(从低地址到高地址)将为5 0 0 0