2014-08-31 94 views
0

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

另外说我设置x = 5;

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

谢谢

+1

存储器用于'int'保证是连续的,尽管它不是必需的一共4个字节。另一个问题取决于系统的字节顺序。 – 2014-08-31 18:27:34

+0

什么是[连续内存](http://stackoverflow.com/questions/4059363/what-is-a-contiguous-memory-block)。 – Igor 2014-08-31 18:28:38

+0

'&x'会给你第一个字节的地址 – Quest 2014-08-31 18:29:55

回答

6

int可以四个字节,尽管这真的取决于编译器。因此为什么有特定大小的类型,如uint32_t。但是让我们说出于参数的缘故,你的int是四个字节。

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

但是,假设最右边的字节是最不重要的,对于big-endian机器才是正确的。在一个小端架构(如86),最左边的字节将包含101代表人数5

+1

“一个int可以是四个字节,但这实际上取决于编译器。”更像是“依赖*体系结构/ ABI *”。 – kay 2014-08-31 18:34:22

+0

我们称之为“依赖实施”... – EOF 2014-08-31 18:35:50

+0

酷!我很高兴你包括大端和小端,我正在采用一个机器组织,并开始谈论这些东西。谢谢。 – Arrow 2014-08-31 18:46:41

2

为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("%d\n", *intPtr); 

    charPtr = (char*) intPtr; 
    for (i = 0; i < size; i++) { 
     printf("%d\n", *(charPtr++)); 
    } 

} 
1

一些不准确之处:

  1. int的大小是平台相关的(尽管在大多数情况下的确是4字节)。

  2. 你是什么意思“查看地址”?如果你想通过调试器观察它,那么继续,你很可能会看到相邻的地址。如果您想将int变量中访问一个特定的地址,那么你就可以很容易地用char指针这样做:

    int x = 5;

    char* p = (char*)&x;

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

  3. 的地址1000至1003年的内容依赖于底层的HW架构的字节序:

    • 在大端处理器,其内容(从低地址的高地址)将是0 0 0 5
    • 在小端处理器,其内容(从低地址向高地址)将5 0 0 0