在程序没有执行前,有几个内存分区已经确定,虽然分区确定,但是没有加载内存,程序只有运行时才加载内存:
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);