1. C程序的内存分区
1、栈区(stack):由编译器自动分配释放,存放函数的参数值,局部变量值等。
2、堆区(heap):一般由程序员分配释放,随叫随到,挥之即走。
3、全局/静态区(static):全局变量和静态变量的存储是放在一起的,在程序编译时分配。
4、文字常量区:存放常量字符串。
5、程序代码区:存放函数体(包括类的成员函数、全局函数)的二进制代码。
具体代码表示如下:
#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>
int laoyezi = 58;
//int girl = 17;
//1. 栈的内存
void say_hello(const char * msg) { //函数的参数和局部变量存放在栈区
if (msg) {
printf("Hello, %s!", msg);
}
else {
printf("Hello, who are u?\n");
}
printf("老爷今年 %d 岁! \n", laoyezi);
}
void gui_fang(int jiaren) {
static int girl = 17;
if (girl == 17) {
girl = 18;
} else {
girl = 16;
}
printf("小姐今年 %d 岁! \n", girl);
}
int main(void) {
int num = 0;
int *salary = NULL;
//4. 字符常量
char *p = "童媳";
char *p1 = "童媳";
printf("p: 0x%p p1: 0x%p\n", p, p1);
system("pause");
exit(0);
//3. 全局变量/静态变量
printf("老爷今年 %d 岁!\n", laoyezi);
gui_fang(0);
gui_fang(0);
//分配一个整形变量的动态内存就这么写
//salary = new int(666);
//2. 堆,动态内存堆区
salary = new int; //在堆区分配动态内存
*salary = 100;
printf("salary:%d\n", *salary);
delete salary; //不加会造成内存泄漏
system("pause");
exit(0);
//say_hello("少年们!");
printf("请输入需要雇佣的佣人数量:\n");
scanf_s("%d", &num);
if (num <= 0) {
//提示用户重新输入
}
salary = new int[num];
for (int i = 0; i < num; i++) {
*(salary + i) = i + 1;
}
for (int i = 0; i < num; i++) {
printf("第%d个佣人的薪资:%d\n", i+1, salary[i]);
}
printf("-----over-----");
delete[] salary;
//切记,delete 后的动态内存,禁止访问
system("pause");
return 0;
}
今天学习了C程序的内存分布,知道了C程序的内存分区主要分5区分别是:代码区、常量区、全局数据区、堆区、栈区。
学习地震监测系统之前要掌握相关的技术。