C语言内存及堆栈操作

2020-08-11  本文已影响0人  玉宾

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

----  网易云热评

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

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);

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

上一篇下一篇

猜你喜欢

热点阅读