C语言内存函数动态分配内存、释放内存和对内存内容进行操作。

C语言中的内存函数主要用于动态分配内存、释放内存和对内存内容进行操作。这些函数都在标准库 <stdlib.h><string.h> 中定义。以下是 C 语言常用的内存函数及其详细说明:

1. 动态内存管理函数

这些函数位于 <stdlib.h> 中,用于在运行时分配和释放内存。

1.1 malloc

示例

功能:分配一块指定大小的内存,返回指向内存块起始地址的指针。

语法:c复制代码void* malloc(size_t size);

参数

size: 要分配的字节数。

返回值

成功:返回内存块的首地址。

失败:返回 NULL

注意

内存中的初始值未初始化(随机值)。

示例

int* ptr = (int*)malloc(10 * sizeof(int)); // 分配 10 个整数大小的内存
if (ptr == NULL) {
    printf("内存分配失败\n");
}

1.2 calloc

  • 功能:分配一块内存并初始化为 0。
  • 语法
void* calloc(size_t num, size_t size);

参数

  • num: 元素数量。
  • size: 每个元素的大小。

返回值

  • 成功:返回内存块的首地址。
  • 失败:返回 NULL

注意

  • 分配的内存会自动初始化为 0。

示例

int* ptr = (int*)calloc(10, sizeof(int)); // 分配并初始化 10 个整数
if (ptr == NULL) {
    printf("内存分配失败\n");
}

1.3 realloc

  • 功能:调整已分配内存块的大小。
  • 语法
void* realloc(void* ptr, size_t new_size);

参数

  • ptr: 指向已分配内存的指针。
  • new_size: 新的内存块大小。

返回值

  • 成功:返回新内存块的指针。
  • 失败:返回 NULL,原内存不变。

注意

  • 如果扩展内存成功,原数据会被保留。
  • 如果缩小内存,可能会丢失超出新大小的数据。

示例





int* ptr = (int*)malloc(5 * sizeof(int));
ptr = (int*)realloc(ptr, 10 * sizeof(int)); // 扩展内存到 10 个整数

1.4 free

  • 功能:释放由 malloccallocrealloc 分配的内存。
  • 语法:c复制代码
void free(void* ptr);

参数

  • ptr: 指向已分配内存的指针。

注意

  • 释放后,指针不再指向有效内存,需要将指针置为 NULL 避免悬空指针问题。

示例





free(ptr);
ptr = NULL; // 避免悬空指针

2. 内存操作函数

这些函数位于 <string.h> 中,用于操作内存块。

2.1 memset

  • 功能:将指定值填充到一段内存中。
  • 语法:c复制代码
void* memset(void* ptr, int value, size_t num);

参数

  • ptr: 指向内存块的指针。
  • value: 要填充的值(以字节为单位)。
  • num: 要填充的字节数。

返回值:返回指向内存块的指针。示例





int arr[10];
memset(arr, 0, sizeof(arr)); // 将数组全部初始化为 0

2.2 memcpy

  • 功能:将一块内存复制到另一块内存。
  • 语法:c复制代码
void* memcpy(void* dest, const void* src, size_t num);

参数

  • dest: 目标内存地址。
  • src: 源内存地址。
  • num: 要复制的字节数。

返回值:返回目标内存地址。注意

  • 源地址和目标地址不能重叠。

示例





char src[] = "Hello";
char dest[10];
memcpy(dest, src, strlen(src) + 1); // 复制字符串

2.3 memmove

  • 功能:将一块内存复制到另一块内存,支持重叠区域。
  • 语法:c复制代码
void* memmove(void* dest, const void* src, size_t num);

参数

  • dest: 目标内存地址。
  • src: 源内存地址。
  • num: 要复制的字节数。

返回值:返回目标内存地址。注意

  • memcpy 安全,但速度稍慢。

示例





char str[] = "HelloWorld";
memmove(str + 5, str, 5); // 将前 5 个字符移动到后面

2.4 memcmp

  • 功能:比较两块内存的内容。
  • 语法
int memcmp(const void* ptr1, const void* ptr2, size_t num);

参数

  • ptr1: 第一块内存的地址。
  • ptr2: 第二块内存的地址。
  • num: 比较的字节数。

返回值

  • 0:内存内容相同。
  • 0:ptr1 内容大于 ptr2
  • <0:ptr1 内容小于 ptr2

示例

char a[] = "Hello";
char b[] = "World";
int result = memcmp(a, b, 5); // 比较前 5 个字节

2.5 strlen

  • 功能:获取字符串长度(不包括空字符 \0)。
  • 语法
size_t strlen(const char* str);

参数

  • str: 字符串指针。

返回值:字符串长度。示例

char str[] = "Hello";
size_t len = strlen(str); // 返回 5

3. 注意事项

  1. 动态内存分配时,必须确保释放以防止内存泄漏。
  2. 对未初始化或释放后的内存操作会导致未定义行为。
  3. memcpymemmove 操作中,需确保内存块的大小和地址合法,避免越界。
  4. 调试工具(如 valgrind)可以帮助检测内存泄漏或越界问题。

总结

这些内存管理和操作函数是 C 语言中处理动态内存和高效操作的核心工具。正确理解并熟练使用这些函数,是编写健壮、高效程序的关键。

发布者:myrgd,转载请注明出处:https://www.object-c.cn/4390

Like (0)
Previous 2024年11月21日 下午10:11
Next 2024年11月22日 上午11:58

相关推荐

  • 通过 PHP 读取微软邮箱(Outlook/Office 365 邮箱)

    通过 PHP 读取微软邮箱(Outlook/Office 365 邮箱)邮件,通常需要使用 Microsoft Graph API,因为微软逐步淘汰了基于用户名和密码的 IMAP/SMTP 方式。Microsoft Graph API 支持 OAuth2.0 认证,可以安全地访问和管理用户邮件。 以下是实现读取微软邮箱邮件的完整示例。 实现步骤 1. 准备工…

    2024年11月25日
    00
  • Java 8 到 Java 17 的升级涉及一些关键变化

    JDK 8 升级到 JDK 17 指南Java 8 到 Java 17 的升级涉及一些关键变化,包括语言特性、API 更新和性能改进。以下是一些升级要点:语法和语言特性:记录类(Record Class):Java 14 引入了记录类,提供了一种简化创建不可变数据对象的方式。密封类(Sealed Classes):Java 15 引入了密封类,允许开发者限制…

    2024年11月27日
    00
  • 多方面的优化包括启动时间、React Native 速度提升 550% 运行时性能以及渲染效率的提升

    React Native 速度提升 550% 可能涉及多方面的优化,包括启动时间、运行时性能以及渲染效率的提升。这通常是通过框架改进、代码优化和工程实践的结合来实现的。以下是实现 React Native 性能大幅提升的一些关键方法和策略: 1. 启动时间优化 1.1 减少 JS Bundle 大小 1.2 预加载资源 1.3 使用优化的原生模块 2. 渲染…

    2024年12月7日
    00
  • C++ STL vector 类:动态数组的高效应用

    vector 是 C++ 标准库(STL)中最常用的容器之一,它提供了一个动态数组的实现,能够根据需要自动扩展或收缩。vector 是一个线性数据结构,具有高效的随机访问能力和动态扩展能力,广泛应用于需要频繁增删元素且对随机访问要求较高的场景。 1. vector 类简介 vector 是 C++ 标准模板库(STL)中提供的一种容器类,它类似于动态数组(d…

    2024年11月25日
    00
  • 在使用 PHP 抓取 HTTPS 资源时,会遇到一些常见问题

    在使用 PHP 抓取 HTTPS 资源时,可能会遇到一些常见问题。这些问题通常与 SSL 配置、证书验证或 PHP 设置相关。以下是常见问题及其解决方法的汇总: 1. SSL 证书验证失败问题描述当使用 file_get_contents、cURL 等方法访问 HTTPS 资源时,可能会遇到类似以下错误: 解决方法更新 cacert.pem 文件下载最新的根…

    2024年12月2日
    00
  • Python 的 json模块序列化数据从文件里读取出来或存入文件

    Python 的 json 模块用于处理 JSON 格式的数据,可以将 JSON 数据与 Python 数据结构之间相互转换。以下是具体用法,包括从文件读取 JSON 数据以及将数据写入文件: 1. 将 JSON 数据从文件中读取到 Python 数据结构 代码示例: 解析过程: 2. 将 Python 数据结构写入到文件中(序列化为 JSON) 代码示例:…

    2024年11月26日
    00
  • 在 Linux 系统上配置 Hadoop 环境,包括创建 hadoop 用户、更新 apt、安装 SSH 和配置 Java 环境

    以下是详细的步骤,用于在 Linux 系统上配置 Hadoop 环境,包括创建 hadoop 用户、更新 apt、安装 SSH 和配置 Java 环境。 1. 创建 Hadoop 用户创建一个名为 hadoop 的新用户: 根据提示设置密码和用户信息。 将 hadoop 用户添加到 sudo 组(可选): 切换到 hadoop 用户: 2. 更新 APT 包…

    2024年12月1日
    00
  • 使用 CLion 编写 C51 (即8051微控制器) 程序时,遇到 sbit 相关报错

    在使用 CLion 编写 C51 (即8051微控制器) 程序时,遇到 sbit 相关报错,通常是因为 CLion 默认并不支持8051的特殊语法和寄存器定义方式。sbit 是 C51 编译器中的一个关键字,用来将一个单独的位(bit)映射到特定的硬件寄存器或端口引脚。常见的报错及解决方法sbit 语法问题: CLion 本身不支持 C51 特有的语法,sb…

    2024年11月27日
    00
  • 在 .NET 环境下,使用 OpenTK 为 SkiaSharp 提供 OpenGL 支持是一个常见的方式

    在 .NET 环境下,使用 OpenTK 为 SkiaSharp 提供 OpenGL 支持是一个常见的方式,可以高效地进行 2D 图形渲染。下面是具体如何实现和一些关键概念的介绍: 背景知识 实现步骤 1. 添加必要的 NuGet 包 确保你的项目安装了以下 NuGet 包: 2. 创建 OpenGL 上下文 使用 OpenTK 创建一个 OpenGL 上下…

    2024年12月8日
    00
  • Docker快速部署Nginx、Redis、MySQL、Tomcat以及制作镜像方法

    使用 Docker 快速部署 Nginx、Redis、MySQL、Tomcat 以及制作镜像 通过 Docker,开发者可以快速部署和管理各种服务。本文介绍如何快速使用 Docker 部署 Nginx、Redis、MySQL 和 Tomcat,以及如何制作自定义镜像。 1. Docker 基础准备 安装 Docker 如果还未安装 Docker,可按照以下步…

    2024年11月26日
    00
  • 实现微信支付提现api接口教程

    微信支付的提现功能,通常是通过调用 企业付款到零钱 API 或 企业付款到银行卡 API 来实现的。以下是如何使用微信支付提现 API 的详细教程,包括其前置条件、接口调用以及注意事项。 1. 准备工作 1.1. 开通微信支付商户号 1.2. 配置证书 将这些文件保存在你的服务器上,用于发起 HTTPS 请求。 1.3. 获取 API 密钥 2. 企业付款到…

    2024年11月24日
    00
  • 在 Go 语言中,对文件的基础操作介绍

    在 Go 语言中,文件操作是基础技能之一,主要通过 os、io 和 io/ioutil 等标准库完成。以下是对文件操作的全面介绍,帮助你在 Go 语言的“成神之路”上迈出关键一步! 1. 创建文件使用 os.Create 创建文件,如果文件已存在会被清空。示例代码 2. 打开文件使用 os.Open 打开文件(只读模式),使用 os.OpenFile 可以指…

    2024年12月2日
    00
  • 在 Spring Boot 中实现 Callback 回调的常用方法

    在 Spring Boot 中实现 Callback(回调) 通常用于处理外部系统调用你的服务接口。例如,当一个第三方服务完成某项操作后通知你的应用完成结果。以下是实现回调的完整流程: 1. 回调的基本流程 2. 示例代码 2.1 创建回调接口 假设第三方服务会通过 POST 请求回调数据到 /callback,并发送如下 JSON 数据: 实现代码如下: …

    2024年11月24日
    00
  • 理解 HTML、HTML5 和 “H5” 区别的重要性

    HTML & HTML5 & H5 的区别在构建现代网页时,理解 HTML、HTML5 和 “H5” 的区别是非常重要的。以下是它们的概念和主要区别: 1. HTML(超文本标记语言)定义HTML 是 HyperText Markup Language 的缩写,即超文本标记语言,用于定义网页内容的结构和含义。特性提供基…

    2024年12月2日
    00
  • JavaScript 前端开发:从入门到精通的方法

    JavaScript 是前端开发的核心语言,它与 HTML 和 CSS 一起构成了 Web 开发的基础。要从入门到精通 JavaScript 前端开发,需要系统化的学习方法和实践。以下是详细的方法和步骤。 1. 理解 JavaScript 的基础 1.1 学习基础语法 1.2 理解函数 箭头函数: 1.3 掌握 DOM 操作 修改内容: 监听事件: 1.4 …

    2024年11月22日
    00

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

在线咨询: QQ交谈

邮件:723923060@qq.com

关注微信