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

 

目录
相关文章
|
2月前
|
存储 编译器 程序员
【C语言】内存布局大揭秘 ! -《堆、栈和你从未听说过的内存角落》
在C语言中,内存布局是程序运行时非常重要的概念。内存布局直接影响程序的性能、稳定性和安全性。理解C程序的内存布局,有助于编写更高效和可靠的代码。本文将详细介绍C程序的内存布局,包括代码段、数据段、堆、栈等部分,并提供相关的示例和应用。
78 5
【C语言】内存布局大揭秘 ! -《堆、栈和你从未听说过的内存角落》
|
2月前
|
存储 缓存 算法
【C语言】内存管理函数详细讲解
在C语言编程中,内存管理是至关重要的。动态内存分配函数允许程序在运行时请求和释放内存,这对于处理不确定大小的数据结构至关重要。以下是C语言内存管理函数的详细讲解,包括每个函数的功能、标准格式、示例代码、代码解释及其输出。
117 6
|
3月前
|
传感器 人工智能 物联网
C 语言在计算机科学中尤其在硬件交互方面占据重要地位。本文探讨了 C 语言与硬件交互的主要方法,包括直接访问硬件寄存器、中断处理、I/O 端口操作、内存映射 I/O 和设备驱动程序开发
C 语言在计算机科学中尤其在硬件交互方面占据重要地位。本文探讨了 C 语言与硬件交互的主要方法,包括直接访问硬件寄存器、中断处理、I/O 端口操作、内存映射 I/O 和设备驱动程序开发,以及面临的挑战和未来趋势,旨在帮助读者深入了解并掌握这些关键技术。
93 6
|
3月前
|
大数据 C语言
C 语言动态内存分配 —— 灵活掌控内存资源
C语言动态内存分配使程序在运行时灵活管理内存资源,通过malloc、calloc、realloc和free等函数实现内存的申请与释放,提高内存使用效率,适应不同应用场景需求。
|
3月前
|
存储 算法 程序员
C 语言指针详解 —— 内存操控的魔法棒
《C 语言指针详解》深入浅出地讲解了指针的概念、使用方法及其在内存操作中的重要作用,被誉为程序员手中的“内存操控魔法棒”。本书适合C语言初学者及希望深化理解指针机制的开发者阅读。
|
3月前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
101 1
|
1月前
|
存储 算法 C语言
【C语言程序设计——函数】素数判定(头歌实践教学平台习题)【合集】
本内容介绍了编写一个判断素数的子函数的任务,涵盖循环控制与跳转语句、算术运算符(%)、以及素数的概念。任务要求在主函数中输入整数并输出是否为素数的信息。相关知识包括 `for` 和 `while` 循环、`break` 和 `continue` 语句、取余运算符 `%` 的使用及素数定义、分布规律和应用场景。编程要求根据提示补充代码,测试说明提供了输入输出示例,最后给出通关代码和测试结果。 任务核心:编写判断素数的子函数并在主函数中调用,涉及循环结构和条件判断。
69 23
|
2天前
|
人工智能 Java 程序员
一文彻底搞清楚C语言的函数
本文介绍C语言函数:函数是程序模块化的工具,由函数头和函数体组成,涵盖定义、调用、参数传递及声明等内容。值传递确保实参不受影响,函数声明增强代码可读性。君志所向,一往无前!
10 1
一文彻底搞清楚C语言的函数
|
1月前
|
算法 C语言
【C语言程序设计——函数】利用函数求解最大公约数和最小公倍数(头歌实践教学平台习题)【合集】
本文档介绍了如何编写两个子函数,分别求任意两个整数的最大公约数和最小公倍数。内容涵盖循环控制与跳转语句的使用、最大公约数的求法(包括辗转相除法和更相减损术),以及基于最大公约数求最小公倍数的方法。通过示例代码和测试说明,帮助读者理解和实现相关算法。最终提供了完整的通关代码及测试结果,确保编程任务的成功完成。
75 15
|
1月前
|
C语言
【C语言程序设计——函数】亲密数判定(头歌实践教学平台习题)【合集】
本文介绍了通过编程实现打印3000以内的全部亲密数的任务。主要内容包括: 1. **任务描述**:实现函数打印3000以内的全部亲密数。 2. **相关知识**: - 循环控制和跳转语句(for、while循环,break、continue语句)的使用。 - 亲密数的概念及历史背景。 - 判断亲密数的方法:计算数A的因子和存于B,再计算B的因子和存于sum,最后比较sum与A是否相等。 3. **编程要求**:根据提示在指定区域内补充代码。 4. **测试说明**:平台对代码进行测试,预期输出如220和284是一组亲密数。 5. **通关代码**:提供了完整的C语言代码实现
63 24

热门文章

最新文章