当前位置: 首页 > news >正文

C语言内存函数及大小端字节序!

全文目录:

    • 开篇语
    • 前言
    • 一、C语言内存函数
      • 1. **`malloc` 函数**
        • 语法:
        • 示例代码:
      • 2. **`calloc` 函数**
        • 语法:
        • 示例代码:
      • 3. **`realloc` 函数**
        • 语法:
        • 示例代码:
      • 4. **`free` 函数**
        • 语法:
        • 示例代码:
    • 二、大小端字节序
      • 1. **字节序(Endianness)**
      • 2. **大端字节序(Big Endian)**
      • 3. **小端字节序(Little Endian)**
      • 4. **如何判断字节序**
        • 示例代码:
      • 5. **字节序的影响**
    • 三、总结
    • 文末

开篇语

哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云/阿里云/华为云/51CTO;欢迎大家常来逛逛

  今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。

  我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,希望以这种方式帮助到更多的初学者或者想入门的小伙伴们,同时也能对自己的技术进行沉淀,加以复盘,查缺补漏。

小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦。三连即是对作者我写作道路上最好的鼓励与支持!

前言

  在C语言编程中,内存管理是非常重要的一个概念。C语言提供了许多与内存操作相关的函数,帮助程序员在运行时动态地管理内存。此外,计算机系统通常有两种不同的字节序(大小端字节序),这对我们理解数据如何在内存中存储和传输至关重要。在这篇文章中,我们将深入探讨C语言中的内存函数以及大小端字节序。


一、C语言内存函数

C语言通过标准库提供了许多函数,用于动态分配、释放、复制和设置内存。常用的内存函数有:malloccallocreallocfreememcpy 等。

1. malloc 函数

malloc(memory allocation)函数用于动态分配指定字节数的内存。

语法:
void* malloc(size_t size);
  • 参数size 是要分配的字节数。
  • 返回值:返回一个指向分配内存块的指针。如果分配失败,返回 NULL
示例代码:
#include <stdio.h>
#include <stdlib.h>int main() {int* ptr = (int*)malloc(5 * sizeof(int));  // 分配5个int类型大小的内存if (ptr == NULL) {printf("内存分配失败\n");return 1;}// 使用分配的内存for (int i = 0; i < 5; i++) {ptr[i] = i + 1;printf("%d ", ptr[i]);}free(ptr);  // 释放内存return 0;
}

2. calloc 函数

calloc(contiguous allocation)函数用于分配内存并初始化为零。它与 malloc 的不同之处在于,它会将分配的内存区域初始化为零。

语法:
void* calloc(size_t num, size_t size);
  • 参数num 是要分配的元素数量,size 是每个元素的大小。
  • 返回值:返回一个指向分配内存块的指针。如果分配失败,返回 NULL
示例代码:
#include <stdio.h>
#include <stdlib.h>int main() {int* ptr = (int*)calloc(5, sizeof(int));  // 分配5个int类型大小的内存并初始化为零if (ptr == NULL) {printf("内存分配失败\n");return 1;}// 使用分配的内存for (int i = 0; i < 5; i++) {printf("%d ", ptr[i]);  // 输出为0,因为calloc初始化了内存}free(ptr);  // 释放内存return 0;
}

3. realloc 函数

realloc(reallocation)函数用于调整已分配内存块的大小。如果原始内存块的大小不足,可以使用此函数来重新分配一个更大的内存块。

语法:
void* realloc(void* ptr, size_t size);
  • 参数ptr 是指向已分配内存块的指针,size 是新的内存块大小。
  • 返回值:返回一个指向新分配内存块的指针,如果重新分配失败,则返回 NULL
示例代码:
#include <stdio.h>
#include <stdlib.h>int main() {int* ptr = (int*)malloc(5 * sizeof(int));  // 分配5个int类型大小的内存if (ptr == NULL) {printf("内存分配失败\n");return 1;}// 使用原始分配的内存for (int i = 0; i < 5; i++) {ptr[i] = i + 1;}// 重新分配更大的内存ptr = (int*)realloc(ptr, 10 * sizeof(int));  // 调整为10个int类型大小的内存if (ptr == NULL) {printf("内存重新分配失败\n");return 1;}// 使用重新分配后的内存for (int i = 5; i < 10; i++) {ptr[i] = i + 1;}for (int i = 0; i < 10; i++) {printf("%d ", ptr[i]);}free(ptr);  // 释放内存return 0;
}

4. free 函数

free 函数用于释放之前通过 malloccallocrealloc 分配的内存。释放内存后,指针仍然存在,但不再指向有效的内存区域,因此需要将指针设置为 NULL 来避免悬空指针问题。

语法:
void free(void* ptr);
  • 参数ptr 是指向要释放内存的指针。
示例代码:
int* ptr = (int*)malloc(5 * sizeof(int));  // 分配内存
free(ptr);  // 释放内存

二、大小端字节序

1. 字节序(Endianness)

字节序是指数据在内存中存储的顺序,特别是多字节数据类型(如intfloat等)。不同的计算机体系结构有不同的字节序规则,主要有两种类型:

  • 大端字节序(Big Endian):将数据的高字节存储在低地址位置,低字节存储在高地址位置。
  • 小端字节序(Little Endian):将数据的低字节存储在低地址位置,高字节存储在高地址位置。

2. 大端字节序(Big Endian)

在大端字节序系统中,数据的高位字节存储在低地址处,低位字节存储在高地址处。例如,假设我们有一个0x12345678的整数,它在内存中的存储方式为:

内存地址: 0x00    0x01    0x02    0x03
存储内容: 0x12    0x34    0x56    0x78

3. 小端字节序(Little Endian)

在小端字节序系统中,数据的低位字节存储在低地址处,高位字节存储在高地址处。例如,假设我们有一个0x12345678的整数,它在内存中的存储方式为:

内存地址: 0x00    0x01    0x02    0x03
存储内容: 0x78    0x56    0x34    0x12

4. 如何判断字节序

可以通过编写一个简单的C程序来判断当前系统的字节序:

示例代码:
#include <stdio.h>int main() {unsigned int num = 1;unsigned char* byte = (unsigned char*)&num;if (byte[0] == 1) {printf("小端字节序\n");} else {printf("大端字节序\n");}return 0;
}

5. 字节序的影响

字节序的不同会影响数据的存储方式,特别是在不同计算机系统之间进行数据交换时。例如,在进行网络编程时,数据通常需要使用网络字节序(大端字节序)进行传输。


三、总结

在C语言中,内存管理是一个关键的方面,使用malloccallocreallocfree等函数可以有效地分配和释放内存。此外,理解大小端字节序对于跨平台开发和网络编程非常重要,因为不同的计算机体系结构可能使用不同的字节序。

通过了解内存函数和字节序,开发者能够更好地管理内存,并编写高效且可移植的C程序。

… …

文末

好啦,以上就是我这期的全部内容,如果有任何疑问,欢迎下方留言哦,咱们下期见。

… …

学习不分先后,知识不分多少;事无巨细,当以虚心求教;三人行,必有我师焉!!!

wished for you successed !!!


⭐️若喜欢我,就请关注我叭。

⭐️若对您有用,就请点赞叭。
⭐️若有疑问,就请评论留言告诉我叭。


版权声明:本文由作者原创,转载请注明出处,谢谢支持!

相关文章:

  • Mysql order by 用法
  • Vue + Element UI 表单弹窗输入法卡顿问题解决方案
  • 用 Tailwind CSS 优化你的 Vue 3 项目! ! !
  • 计算机硬件:AMD X670E与B650主板的PCIe通道分配
  • 在 Laravel 12 中实现 WebSocket 通信时进行身份验证
  • 水质监控预警管理平台
  • 构建 Web 浏览 AI Agent:Pydantic + MCP 实现指南
  • C#学习第21天:安全与加密(Security and Cryptography)
  • Linux/AndroidOS中进程间的通信线程间的同步 - 虚拟内存操作
  • 企业级RAG架构设计:从FAISS索引到HyDE优化的全链路拆解,金融/医疗领域RAG落地案例与避坑指南(附架构图)
  • PCIe - ZCU106(RC) + KU5P(EP) + 固化
  • 利用 Kali Linux 进行信息收集和枚举
  • 用python实现鼠标监听与手势交互
  • 【KWDB 创作者计划】一文掌握KWDB的时序表管理
  • iOS与HTTPS抓包调试小结
  • QT生成保存 Excel 文件的默认路径,导出的文件后缀自动加(1)(2)等等
  • 上传下载接口
  • 02 mysql 管理(Windows版)
  • vue3+element plus实现甘特图效果
  • 接口自动化工具如何选择?以及实战介绍
  • 外交部:解放军参加红场阅兵体现了中方对历史的尊重和铭记
  • 最新研究:基因编辑治疗晚期胃肠道癌显成效
  • 加拿大总理访美与特朗普“礼貌交火”
  • 国际上首次,地月空间卫星激光测距试验在白天成功实施
  • 工程机械行业景气度持续回升,三大龙头一季度营收、净利双增
  • 国防部新闻发言人就日本民用飞机侵闯中国钓鱼岛领空答问