C语言内存及堆栈操作

简介: 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;
}


运行结果:


0a2653c851af460fa595bd959398a8f1.png


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


运行结果:


0eacb84100b54626af849e6b562bf92a.png


二、堆栈操作


1、指向栈的指针


int *p;
int a=0;
p=&a;
*p=111;

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


int *p
//手动申请堆空间
p=(int *)malloc(sizeof(int));
*p=111;
.....
//手动释放堆空间
free(p);
目录
相关文章
|
17天前
|
程序员 C语言
C语言库函数 — 内存函数(含模拟实现内存函数)
C语言库函数 — 内存函数(含模拟实现内存函数)
28 0
|
3天前
|
C语言
C语言:内存函数(memcpy memmove memset memcmp使用)
C语言:内存函数(memcpy memmove memset memcmp使用)
|
19天前
|
存储 编译器 C语言
深入探索C语言动态内存分配:释放你的程序潜力
深入探索C语言动态内存分配:释放你的程序潜力
28 0
|
3天前
|
程序员 编译器 C语言
C语言知识:动态内存管理(malloc free calloc realloc)
C语言知识:动态内存管理(malloc free calloc realloc)
|
4天前
|
存储 C语言
C语言中字符串的引用与数组元素操作
C语言中字符串的引用与数组元素操作
12 0
|
26天前
|
Java
java中jar启动设置内存大小java -jar 设置堆栈内存大小
java中jar启动设置内存大小java -jar 设置堆栈内存大小
13 1
|
28天前
|
编译器 C语言 C++
【C语言】calloc()函数详解(动态内存开辟函数)
【C语言】calloc()函数详解(动态内存开辟函数)
25 0
|
28天前
|
存储 编译器 程序员
【C语言】内存的动态分配与释放
【C语言】内存的动态分配与释放
27 0
|
1月前
|
存储 JSON 监控
Higress Controller**不是将配置信息推送到Istio的内存存储里面的**。
【2月更文挑战第30天】Higress Controller**不是将配置信息推送到Istio的内存存储里面的**。
14 1
|
1天前
|
存储 算法
【三种方法】求一个整数存储在内存中二进制中的1的个数附两道课外练习题
【三种方法】求一个整数存储在内存中二进制中的1的个数附两道课外练习题
7 0