c语言内存四区、数据存储范围和内存存储方向
(1)代码区通常是共享只读(代码无法修改)的,即可以被其他的程序调用,例如运行两个qq,除了数据不一样,代码都是一样的,
每次运行qq,都会将代码和数据加载到内存中,除了数据,每次加载的代码都是一样的,可以大大节省内存。
(2)栈是由系统分配内存,栈的内存是固定的。
(3)堆区是程序员自己分配内存和释放内存,如果不释放内存,那么就只能等程序结束后才会由系统回收。内存不释放,那么在程序运行期间可能会导致内存不够用。
程序在没有运行前只有代码区和数据区,运行程序后会加载到内存中,才有堆区和栈区。
数据存储范围?
1.栈区:栈区内存自动申请,不需要程序手动管理(我们说的分配内存其实是分配一个地址,内存其实是运行之后才会分配)
#include<stdio.h> int* myFunc()
{
int a = 10;//局部变量放在栈区,使用完后内存自动释放,所以不要返回局部变量的地址
return &a;//数组名就是数组的首地址
}
char* getString()
{
char str[] = "Hello World";
return str;
}
void test01()
{
int* p = myFunc();//myFunc中的a内存使用完后即被释放了,不会在test01中出现,所以打印不出值,会报错
printf("*p=%d\n",*p);
}
void test02()
{
char* s = NULL;
s=getString();
printf("s=%s\n",s);
}
int main()
{
test01();
test02();
}
第一步:当执行getString方法中的代码时候
第二步:getString方法执行完后,栈区中的数组str的内存就释放了,所以此时0x002这个地址就不存在了,当然就找不到值 hello World了。
输出结果
*p=10
s=烫烫烫烫烫烫狞?
请按任意键继续. . .
2.堆区:开辟堆空间 int * p= malloc(sizeof(int)*10);
#include<stdio.h>
#include<string.h>
#include<stdlib.h> void alloctateSpace(char * p)
{
p = malloc(100);//分配100个字节的内存
memset(p,0,100);//将这块内存中的值初始化为0值
strcpy(p,"hello world!");
} void test02()
{
char* ret = NULL;
alloctateSpace(ret);
printf("ret=%s\n",ret);//ret=null
} int main()
{
test02();
system("pause");
}
首先,执行allocateSpace方法完后,由于char * p是形参,所以执行完该方法后,p就被释放掉了
所以最终ret的地址为NULL。
c语言内存四区、数据存储范围和内存存储方向的更多相关文章
- 11、C内存四区模型
转载于:https://blog.csdn.net/wu5215080/article/details/38899259 内存四区模型 图1.内存四区模型流程说明1.操作系统把物理硬盘代码load到内 ...
- C++变量存储类别和内存四区
变量存储类别 变量声明/定义的一般形式: 存储类别 数据类型 变量名 存储类别指的是数据在内存中存储的方法.存储方法分为静态存储和动态存储两大类.标准C语言为变量.常量和函数定义了4种存储类型:ext ...
- 深入理解C语言-深入理解内存四区
数组与指针 当数组做函数参数的时候,会退化为一个指针 此时在函数内是得不到数组大小的 因此,数组做函数参数的时候需要传递数组大小,也就是多传递一个参数 void func(int arr[], int ...
- C语言内存四区的学习总结(一)---- 静态区
最近重新学习C语言相关知识,重新提到内存四区的概念,那么在之前的学习的基础上,在这儿做一个简单的总结与分享. 一.内存四区建立的流程 可以简单直观的查看下面的这个图片,直接的说明我们的程序在内存中是如 ...
- C语言之内存四区模型和函数调用模型
内存四区模型 流程说明1.操作系统把物理硬盘代码load到内存2.操作系统把c代码分成四个区3.操作系统找到main函数入口执行 1.内存四区: 一个由c/C++编译的程序占用的内存分为以下几个部 ...
- C语言提高 (1) 第一天 数据类型本质与内存四区
(物联网的分层的概念 b/s c/s 结构 习惯: 在C语言 0 函数执行成功 <0是错误 >1做一些返回值处理 3 课前准备 工作经验,记录 4 数据类型的本质 数据类型的本质是固定大小 ...
- C语言内存四区的学习总结(二)---- 堆区
接上篇,内存四区的分析-静态区,下面来说明一下堆区总结. 堆区分析: 堆区(heap):一般由程序员分配释放(动态内存申请与释放),若程序员不释放,程序结束时可能由操作系统回 就下面的程序: #inc ...
- C语言进阶之路(一)----C语言的内存四区模型
内存四区模型:操作系统给C/C++编写的程序分配内存,通常将分配的内存划分为以下四个区域:1.栈区:存放局部变量,用完由操作系统自动释放2.堆区:动态分配给程序的内存区域,由程序员手动释放3.数据区: ...
- C语言内存四区的学习总结(三)---- 栈区
接上篇内存四区的堆区的总结,下面做一些栈区的相关总结. 一.栈区的分析: 就下面测试程序 #include "stdio.h" #include "string.h&qu ...
- C语言的内存四区模型和函数调用模型
首先是操作系统将代码程序加载到内存中 然后将内存分为4个区 栈区,程序的局部变量区,函数传递的参数,由编译器自动进行内存资源的释放. 堆区,动态内存申请,如果不手动释放内存,则这块内存不会进行析构. ...
随机推荐
- 面试突击79:Bean 作用域是啥?它有几种类型?
Spring 框架作为一个管理 Bean 的 IoC 容器,那么 Bean 自然是 Spring 中的重要资源了,那 Bean 的作用域是什么意思?又有几种类型呢?接下来我们一起来看. PS:Java ...
- 小技巧:webpack中@的配置和用法
好家伙, 当我们要各种两个文件去引用别的文件时,一般这么写 import msg from '../../msg.js' 那么如果文件藏得很深,'../'会变得很多,不美观,也不直观 所以我们又又又可 ...
- luogu P1488 肥猫的游戏
肥猫的游戏 P1488 肥猫的游戏 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题目描述 野猫与胖子,合起来简称肥猫,是一个班的同学,他们也都是数学高手,所以经常在一起讨论数学问 ...
- Job And Schedule (V8R6C3)
KingbaseES 数据库提供了 kdb_schedule 扩展,使得用户能通过类似oracle job 的方式进行job调用.kdb_schedule 提供了三个Schema :dbms_job ...
- 【python】生成一段连续的日期
date-gen.py import datetime def date_generate(start_date, end_date): print(f'Hi, {start_date}, {end_ ...
- 关于Ubuntu系统无法输入中文的问题,即使做了种种修改
原网址:https://shurufa.sogou.com/linux/guide 在经历一晚上一及一下午的奋战后,找到了最终解决方案,该解决方案使用的是搜狗输入法 在操作之前有以下注意事项:所有操作 ...
- RedHat Linux升级内核
操作系统:Red Hat 6.4 内核文件:linux-3.10.1.tar.gz https://www.cnblogs.com/cherish-sweet/p/newyum.html uname ...
- Centos7下安装postgresql(tar包形式安装)
Centos7下安装postgresql(tar包形式安装) 1.官网下载地址: https://www.postgresql.org/ftp/source/ 2.将下载来tar包上传到linux服务 ...
- haodoop概念总结
大数据部门组织结构 Hadoop的优势(4高) 高可靠性:Hadoop底层维护多个数据副本 高扩展性:在集群间分配任务数据,可方便的扩展 高效性:在MapReduce的思想下,Hadoop时并行工作的 ...
- JAVA SE 基础总结
§ 基础知识 一.程序组织与运行原理 1.1 程序组织 一个 JAVA 程序文件中主要由如下几部分构成: package 声明 public 类:public 类与类文件名相同,因为其是作为该类文件唯 ...