C/C++:内存分配,详解内存分布(P:图解及代码示例)

C/C++:内存分配,详解内存分布(P:图解及代码示例)

文章目录

内存分布内存分布图解内存分布说明常见的内存分布图

习题

首先这里有一个计算机分配内存的概念.

如下:

当内存开辟空间时, 内存的分配是从高位到低位当往内存存储数据时, 是从低位往高位存储

注意:一般情况下内存都是连续开辟.

一次性开辟了4个空间 a1,b2,c2,d2 输出他们的地址看一下.

int main(){

int a1 = 5, b2 = 10, c2 = 15, d2 = 20;

printf("a1......%p\n",&a1);

printf("b2......%p\n",&b2);

printf("c2......%p\n",&c2);

printf("d2......%p\n",&d2);

int * p3 = &b2;

printf("p3......%d\n",*p3);//输出 本身指向的值

printf("p3......%d\n",*(p3+1));//指向 a1

printf("p3......%d\n",*(p3-1));//指向 c2

return 0;

}

代码生成图:

内存分布

我们先来看下面的一段代码和相关问题

int globalVar = 1;

static int staticGlobalVar = 1;

void Test()

{

static int staticVar = 1;

int localVar = 1;

int num1[10] = {1, 2, 3, 4};

char char2[] = "abcd";

char* pChar3 = "abcd";

int* ptr1 = (int*)malloc(sizeof (int)*4);

int* ptr2 = (int*)calloc(4, sizeof(int));

int* ptr3 = (int*)realloc(ptr2, sizeof(int)*4);

free (ptr1);

free (ptr3);

}

1. 选择题:

选项: A.栈 B.堆 C.数据段 D.代码段

globalVar在哪里?____ staticGlobalVar在哪里?____

staticVar在哪里?____ localVar在哪里?____

num1 在哪里?____char2在哪里?____

pChar3在哪里?____ ptr1在哪里?____

2. 填空题:

sizeof(num1) = ____; 40

*char2在哪里?___ *pChar3在哪里?____ *ptr1在哪里?____

sizeof(char2) = ____; 5 strlen(char2) = ____; 4

sizeof(pChar3) = ____; 4 strlen(pChar3) = ____; 4

sizeof(ptr1) = ____; 4

内存分布图解

内核空间是在高地址 代码段在低地址

内存分布说明

内核空间: 放置操作系统相关的代码和数据。(用户不能直接进行操作 ------ 可以通过调用系统提供的 api 函数)栈又叫堆栈,非静态局部变量/函数参数/返回值等等,栈是向下增长的。内存映射段是高效的I/O映射方式,用于装载一个共享的 动态内存库。用户可使用系统接口创建共享共享内存,做进程间通信。堆用于程序运行时动态内存分配,堆是可以上增长的。数据段–存储全局数据和静态数据。代码段–可执行的代码/只读常量。

常见的内存分布图

1、

内存区域:栈、堆、全局区、常量区、代码区

栈:系统自动分配的空间,只要不特殊声明,就定义在栈区,函数的区域也在栈上。栈是向下增长的。(const 在栈里)堆:使用动态内存分配的方式可以申请堆空间,用完要手动释放。全局区:全局变量、静态变量(static)常量区:代码中的数字,字符等常量,例如’a’,—1.2等代码区:存放可执行代码,避免频繁的读硬盘。

2、

Data:数据段,要放在可执行文件中的数据,包括堆、栈、以初始化的全局变量Bss: 未初始化的全局变量,不占用可执行文件的大小Text: 只读区域,包括常量区和代码区

习题

代码生成阶段的主要任务是:

A. 把高级语言翻译成机器语言 B. 把高级语言翻译成汇编语言 C. 把中间代码变换成依赖具体机器的目标代码 D. 把汇编语言翻译成机器语言

正确答案:

C

答案解析

源代码-->预处理-->编译-->优化-->汇编-->链接–>可执行文件

汇编阶段把汇编语言代码/中间代码翻译成目标机器指令。

对于被翻译系统处理的每一个C语言源程序,都将最终经过这一处理而得到相应的目标文件。(代码生成阶段) 代码生成阶段的主要任务是把中间代码(或经优化处理之后)变换成特定机器上的低级语言代码,它的工作有赖于硬件系统结构和机器指令含义。选项C正确。

假设在一个 32 位 little endian 的机器上运行下面的程序,结果是多少?

#include

int main(){

long long a = 1, b = 2, c = 3;

printf("%d %d %d\n", a, b, c);

return 0;

}

A. 1,2,3 B. 1,0,2 C. 1,3,2 D. 3,2,1

正确答案

B

答案解析

注:

printf()是一个库函数,C,C++中函数的参数是从右往左入栈的;从左往右出栈

栈的生长方向是从高往低的

小端模式是低位存储在低字节

%d格式输出的是4个字节大小,而long long为8个字节

所以,a=1,b=0,c=2

如下代码输出结果是什么?

#include

char *myString()

{

char buffer[6] = {0};

char *s = "Hello World!";

for (int i = 0; i < sizeof(buffer) - 1; i++)

{

buffer[i] = *(s + i);

}

return buffer;

}

int main(int argc, char **argv)

{

printf("%s\n", myString());

return 0;

}

A. Hello B. Hello World! C. Well D. 以上全部不正确

正确答案: D

答案解析

函数char *myString()中没有使用new或者malloc分配内存,所有buffer数组的内存区域在栈区随着char *myString()的结束,栈区内存释放,字符数组也就不存在了,所以会产生野指针,输出结果未知

相关风暴

追女生第几次约会可以牵手?揭秘牵手的最佳时机!
义乌365便民中心电话

追女生第几次约会可以牵手?揭秘牵手的最佳时机!

🌧️ 08-12 👁️ 1171
借了吗审核要多久?下款快吗?
365bet体育网站

借了吗审核要多久?下款快吗?

🌧️ 09-06 👁️ 2144
河南安阳电话区号查询
365bet体育网站

河南安阳电话区号查询

🌧️ 10-08 👁️ 9111
dnf圣物一套多久
义乌365便民中心电话

dnf圣物一套多久

🌧️ 08-15 👁️ 9326