gpt4 book ai didi

c - C中的变量声明及其内存地址

转载 作者:IT王子 更新时间:2023-10-28 23:35:10 26 4
gpt4 key购买 nike

我创建了一个简单的程序:

#include <stdio.h>

int main()
{
int s1;
int s2;
int s3;

int *p1, *p2, *p3;

p1 = &s1;
p2 = &s2;
p3 = &s3;

printf("%d\n%d\n%d", p1, p2, p3);
}

每当我运行这个程序时,它都会打印出指针 p1p2p3 的内存地址,有趣的是这些值有 12 的区别。我想知道这背后的原因。为什么地址相差12

注意:每次我执行程序都会发生这种情况。

输出:

enter image description here


我在许多类型的变量中测试了同一个程序,我得到的结果是..

当变量是 char 类型时。 enter image description here


当变量是长类型时 enter image description here


当我声明 int array 时,每个数组的大小为 1。 enter image description here


当第二个声明数组的大小为 2 时,它会获得额外的 4 字节偏移量。 enter image description here

最佳答案

我猜这是一个调试版本。我已经尝试过使用 Visual Studio 2010 构建的这个程序。在调试时,地址之间有 12 个字节的差异。在 Release模式下有一个 4 字节 (sizeof(int)) 的差异。

在调试版本中,MSVC 编译器添加了额外的数据,以帮助检测缓冲区溢出和未初始化内存的使用。如果您在 printf 语句上设置断点并查看 p1 指向的内存,您应该会在内存中看到 cc

内存初始化为许多不同的魔法值。 cccccccc 表示未初始化的堆栈空间。有关更详细的列表,请参阅此问题的答案:In Visual Studio C++, what are the memory allocation representations?

关于c - C中的变量声明及其内存地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16575276/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com