C语言内存及堆栈操作

毕业了,想留的人没能留住,想要的生活也没有如约而至,也就这样了。。。

----  网易云热评

 

在程序没有执行前,有几个内存分区已经确定,虽然分区确定,但是没有加载内存,程序只有运行时才加载内存:

text(代码区):只读,例如函数

data:初始化的数据,全局变量,static变量,文字常量区

bss:没有初始化的数据,全局变量,static变量

stack:栈区,返回值,普通局部变量,自动管理内存,先进后出的特点 

heap:堆区,手动申请空间malloc(),手动释放free(),程序结束自动回收

一、内存操作

1、memset,将一个数组的内存区域前n个成员用字符填充,主要用来重新初始化数据

#include <stdio.h>

#include <string.h>

int main() {

       int a[100];

       for (int i=0;i<10;i++)

       {

              a[i] = i + 1;

       }

       printf("%d\n",a[1]);

        //将a的前sizeof(a)个元素,用0填充

       memset(a, 0, sizeof(a));

       printf("%d\n", a[1]);

       system("pause");

       return 0;

}

 

2、memcpy,全拷贝,不管中间是否有结束符,memmove,如果内存重叠,用这个拷贝

#include <stdio.h>

#include <string.h>

int main() {

       char p[]="aiyou\0bucuo";

       char buf[100];

       int a = sizeof(p);

       printf("字符串长度:%d\n", a);

       strncpy_s(buf, 100, p,a);

       printf("buf1=%s\n", buf);

       printf("buf2=%s\n", buf + strlen("aiyou") + 1);

        //将buf初始化,用0填充

       memset(buf, 0, sizeof(buf));

        //拷贝,将p的内容拷贝到buf中,大小为a

       memcpy(buf,p,a);

       printf("buf3=%s\n", buf);

       printf("buf4=%s\n", buf + strlen("aiyou") + 1);

       

       system("pause");

       return 0;

}

运行结果:

 

3、memcmp,比较数据是否相等

#include <stdio.h>

#include <string.h>

int main() {

       char a[] = "abc";

       char b[] = "abd";

       char c[] = "abc";

       printf("对比结果为:%d\r\n", memcmp(a,b ,sizeof(a)));

       printf("对比结果为:%d\r\n", memcmp(b, a, sizeof(a)));

       printf("对比结果为:%d\r\n", memcmp(a, c,sizeof(a)));

       system("pause");

       return 0;

       system("pause");

       return 0;

}

运行结果:

 

 

二、堆栈操作

1、指向栈的指针

int *p;

int a=0;

p=&a;

*p=111;

2、指向堆指针,参数指定堆区分配多大空间

int *p

//手动申请堆空间

p=(int *)malloc(sizeof(int));

*p=111;

.....

//手动释放堆空间

free(p);

 

欢迎关注公众号:顺便编点程

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

web安全工具库

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值