c语言 内存四区基本模型 堆栈区

数据类型总结
数据类型可理解为创建变量的模具(模子);是固定内存大小的别名。
数据类型的作用:编译器预算对象(变量)分配的内存空间大小
数据类型大小计算(sizeof)
可以给已存在的数据类型起别名typedef
内存四区模型
在这里插入图片描述
在这里插入图片描述
静态存储区和堆区的一些理解:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *getstr1()
{
    char *p1 = "abc";//"abc"作为内存空间变量被定义在全局区,p1指针变量被定义在栈区,把abc在内存中的地址赋给指针p1
    return p1;//这个函数运行完成后,就被析构了,p1占用的四个字节也被清除了
}

char* getstr2()
{
    char* p2 = "abc";//这里如果定义的也是abc的话,c++编译器就会做代码优化,只分配一块内存
    return p2;
}
int main()
{
    char *p1 = NULL;
    char *p2 = NULL;
    p1 = getstr1();
    p2 = getstr2();

    //指针赋值
    /*
    int a1 = 1;
    int a2 = 2;
    int *a = &a1;//当“=”的左操作数是*a时,改变的是a所指向的地址存放的数据;
                    // 当“ = ”的左操作数是a时,改变的是a所指向的地址。
    int *b = &a2;//指针本身指向是一块地址,直接%d打印就是十进制的地址号 %p打印就是16进制的地址号
    *a = *b;
    printf("a1= %d ,a2= %d \n", *a, *b);
    */
     
    printf("p1= %d ,p2= %d \n", p1, p2);//这里p1 p2所指向的内存空间是一样的,都是全局区的abc,所以打印的地址是一样的
    printf("p1= %s ,p2= %s \n", p1, p2);
    system("pause");
    return 0;
}

上述函数示意图
在这里插入图片描述
堆区和栈区

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char* get_num(int num)
{
    char* p1 = NULL;
    p1 = (char*)malloc(sizeof(int) * num);//malloc申请的空间在堆区
    if (p1 == NULL)
    {
        return NULL;
    }
    return p1;
}
char* get_num2()
{
    char buf[64];//这里在堆区申请了64个char的内存空间
    strcpy(buf, "11111111111");
    return buf;//这里是错误的做法,返回的是buf数组位于栈区的首地址
}
int main()
{
    char* tmp = NULL;
    tmp = get_num(10);
    if (tmp == NULL)
    {
        return NULL;
    }
    else
    {
        strcpy(tmp, "11112");//strcpy是用来复制字符串的,将11112赋值给tmp指针指向的内存空间
    }
    //printf("tmp=%s /n", tmp);


    tmp = get_num2();//系统调用完这个函数后,会把它析构,那么tmp指向原来buf数组的首地址就会出错
    printf("tmp=%s /n", tmp);//这里会打印乱码

    system("pause");
    return 0;
}  

在这里插入图片描述
堆栈的开口属性测试

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>



//一般认为:栈的开口向下
堆的开口朝上
//buf的内存地址buf+1,永远向上
void main()
{
	int a;
	int b;

	char buf[128] = {"hello"};
	printf("&buf[1]= %d ,&buf[2]= %d \n",&buf[1],&buf[2] );
	printf("&a: %d =,&b :%d ", &a, &b);
	system("pause");
	return;


}```
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200928120706177.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2FnZW50a3k=,size_16,color_FFFFFF,t_70#pic_center)

**函数调用模型**

如图所示 main是主函数 fa fb 是被调用函数
![在这里插入图片描述](https://img-blog.csdnimg.cn/2020092812192450.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2FnZW50a3k=,size_16,color_FFFFFF,t_70#pic_center)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值