gpt4 book ai didi

c - C程序的内存布局

转载 作者:行者123 更新时间:2023-11-30 21:44:20 25 4
gpt4 key购买 nike

当我运行此 C 代码时,我得到如下所示的输出。这些数字意味着什么,为什么就像这样,我们可以从中学到什么关于变量位置的信息。

#include <stdio.h>
#include <stdlib.h>

int f(int i,int j, int *ptr);

int main (int argc, char *argv[]) {
int a=2;
int b=4;
int *age = malloc(sizeof(int));
*age =0;
*age +=a;
printf("Main Address of local variable a=%u,b=%u and *age=%u and address of dynamic variable %u\n", (unsigned int)&a,(unsigned int)&b,(unsigned int) &age, (unsigned int) age);

f(a,b, age);
return 0;
}

int f(int i,int j, int *ptr) {
printf("Function f: address of local variable a=%u,b=%u and address of dynamic variable %u\n (unsigned int) &i,(unsigned int)&j,(unsigned int) ptr);
}

输出:

ubuntu@ubuntu-VirtualBox:~/code$ ./var0
Main Address of local variable a=3212861652,b=3212861656 and
*age=3212861660 and address of dynamic variable 158076936
Function f: address of local variable
a=3212861616,b=3212861620 and address of dynamic variable
158076936

最佳答案

一般来说,内存的布局是这样的:

High Addresses
--------------
| Stack |
---------------
| |
---------------
| Heap |
---------------
| Static Data |
---------------
| Code |
---------------
Low Adresses

当你初始化像a,b,age这样的局部变量时,每个变量都可以在堆栈上占用一个由其类型决定的空间。换句话说,它在堆栈上获得了自己的地址。请注意,由于内存的布局方式,这些变量具有更高的地址值,与上图一致。现在,了解a的地址是3212861652,其值为2age的地址为3212861660,其值为158076936

age 的值是堆上的内存地址。这就是调用 malloc 返回的结果。当您使用malloc(sizeof(int))时,您是在请求堆上的一个地址,该地址可用于自由存储sizeof(int)字节。堆的位置要低得多,因此age的值远低于它存储的地址。

关于c - C程序的内存布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58350044/

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