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

举报
喵手 发表于 2025/03/19 22:01:48 2025/03/19
【摘要】 开篇语哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云/阿里云/华为云/51CTO;欢迎大家常来逛逛  今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。  我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,...

开篇语

哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区: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 !!!


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

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


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

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。