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语言通过标准库提供了许多函数,用于动态分配、释放、复制和设置内存。常用的内存函数有:malloc
、calloc
、realloc
、free
和 memcpy
等。
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
函数用于释放之前通过 malloc
、calloc
或 realloc
分配的内存。释放内存后,指针仍然存在,但不再指向有效的内存区域,因此需要将指针设置为 NULL
来避免悬空指针问题。
语法:
void free(void* ptr);
- 参数:
ptr
是指向要释放内存的指针。
示例代码:
int* ptr = (int*)malloc(5 * sizeof(int)); // 分配内存
free(ptr); // 释放内存
二、大小端字节序
1. 字节序(Endianness)
字节序是指数据在内存中存储的顺序,特别是多字节数据类型(如int
、float
等)。不同的计算机体系结构有不同的字节序规则,主要有两种类型:
- 大端字节序(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*)#if (byte[0] == 1) {printf("小端字节序\n");} else {printf("大端字节序\n");}return 0;
}
5. 字节序的影响
字节序的不同会影响数据的存储方式,特别是在不同计算机系统之间进行数据交换时。例如,在进行网络编程时,数据通常需要使用网络字节序(大端字节序)进行传输。
三、总结
在C语言中,内存管理是一个关键的方面,使用malloc
、calloc
、realloc
、free
等函数可以有效地分配和释放内存。此外,理解大小端字节序对于跨平台开发和网络编程非常重要,因为不同的计算机体系结构可能使用不同的字节序。
通过了解内存函数和字节序,开发者能够更好地管理内存,并编写高效且可移植的C程序。
… …
文末
好啦,以上就是我这期的全部内容,如果有任何疑问,欢迎下方留言哦,咱们下期见。
… …
学习不分先后,知识不分多少;事无巨细,当以虚心求教;三人行,必有我师焉!!!
wished for you successed !!!
⭐️若喜欢我,就请关注我叭。
⭐️若对您有用,就请点赞叭。
⭐️若有疑问,就请评论留言告诉我叭。
版权声明:本文由作者原创,转载请注明出处,谢谢支持!