自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(412)
  • 收藏
  • 关注

原创 C语言队列

1. 数组实现:使用数组来存储队列元素,同时需要两个指针,一个指向队头(front),一个指向队尾(rear)。2. 链表实现:通过链表节点来表示队列元素,队头指针指向链表的头节点,队尾指针指向链表的尾节点。队列是C语言中一种重要的线性数据结构,具有先进先出(FIFO)的特点,就像生活中排队一样,先进入队列的元素先被处理。需要检查队列是否为空,如果不为空,则取出队头元素,更新队头指针。4. 判断队列是否为空:通过检查队头和队尾指针的值(数组实现)或头指针是否为 NULL(链表实现)来判断队列是否为空。

2025-04-05 14:39:25 217

原创 C语言的栈

初始化:需要定义一个栈的数据结构,通常可以用数组或链表来实现。例如,用数组实现时,定义一个数组和一个变量来记录栈顶元素的位置。先检查栈是否已满,若未满,则将元素放入栈顶位置,并更新栈顶指针。先检查栈是否为空,若不为空,则取出栈顶元素,并更新栈顶指针。这段代码实现了一个简单的整数栈,包括初始化、入栈、出栈、获取栈顶元素和判断栈空等功能。- 获取栈顶元素:可以在不弹出栈顶元素的情况下查看栈顶元素的值。- 判断栈空或栈满:通过检查栈顶指针的值来判断栈是否为空或已满。// 定义栈的数据结构。

2025-04-05 14:38:42 207

原创 析构函数和构造函数有什么区别?

析构函数:在类名前加波浪号“~”,无参数和返回值,在对象生命周期结束时被自动调用,用于释放对象占用的资源,如释放内存、关闭文件等。- 析构函数:当对象超出作用域、被delete释放(针对堆上对象)或包含对象的容器被销毁时,析构函数会被自动调用。- 构造函数:与类名相同,无返回值,用于对象创建时初始化成员变量,执行如内存分配、资源初始化等操作。- 构造函数:创建对象时,无论是在栈上、堆上还是作为类的成员变量,都会自动调用对应的构造函数。- 析构函数:不能重载,一个类只能有一个析构函数。

2025-04-01 18:05:44 169

原创 C++构造函数

初始化列表是一种更高效的初始化成员变量的方式,建议尽量使用初始化列表来初始化成员变量,特别是对于复杂对象或有性能要求的场景。- 带参数的构造函数:可以根据传入的参数来初始化对象的成员变量,如上述示例中的 MyClass(int value)。C++ 构造函数是一种特殊的成员函数,用于在创建对象时初始化对象的成员变量。- 默认构造函数:没有参数的构造函数。- 构造函数可以重载,即一个类可以有多个构造函数,它们的参数列表不同。- 为对象的成员变量赋初值,确保对象在创建后处于一个合理的初始状态。

2025-04-01 18:05:12 369

原创 原地扩容与异地扩容

如果原来的内存块后面没有足够的空间, realloc 会在其他合适的内存位置分配一块大小为 size 的新内存块,然后将原来内存块中的数据复制到新内存块中,最后释放原来的内存块,这就类似于异地扩容。在C语言中, realloc 函数用于重新分配内存块的大小,它可以实现原地扩容或异地扩容,具体取决于内存的实际情况。- 如果原来的内存块后面有足够的连续空闲空间来满足新的大小需求, realloc 会尝试在原地扩展内存块,就像原地扩容一样,数据的存储位置不变。printf("内存重新分配失败\n");

2025-03-29 16:44:32 248

原创 C++拷贝函数

当类中包含动态分配的内存或其他需要特殊处理的资源时,必须自定义拷贝构造函数,以避免浅拷贝带来的问题,如多个对象共享同一块内存导致的内存泄漏或数据混乱。std::cout << "obj2 的数据: " << obj2.getData() << std::endl;std::cout << "普通构造函数被调用" << std::endl;std::cout << "拷贝构造函数被调用" << std::endl;- 实现对象之间的深拷贝,即创建一个新对象,其成员变量的值与原对象相同。

2025-03-29 16:35:32 161

原创 C++构造函数

std::cout << "构造函数被调用,初始化 data 为 " << data << std::endl;- 带参数的构造函数:可以根据传入的参数来初始化对象的成员变量,如上述示例中的 MyClass(int num)。C++ 构造函数是一种特殊的成员函数,用于在创建对象时初始化对象的成员变量。- 默认构造函数:没有参数的构造函数。- 如果自定义了构造函数,编译器将不再自动生成默认构造函数,若需要默认构造函数,需手动定义。- 构造函数可以重载,即一个类中可以有多个构造函数,它们的参数列表不同。

2025-03-29 16:34:53 218

原创 C语言单链表

插入和删除操作高效:在单链表中插入和删除元素时,只需修改相关节点的指针,不需要移动大量元素,时间复杂度为O(1)(在已知插入或删除位置的情况下)。以在表头插入为例,只需将新节点的指针指向原表头节点,然后将头指针指向新节点。单链表是由节点组成的,每个节点包含一个数据域和一个指针域。- 不支持随机访问:不能像顺序表那样通过下标直接访问元素,必须从链表头开始逐个遍历节点,访问第i个元素的时间复杂度为O(n)。- 删除节点:找到要删除的节点,将其前一个节点的指针指向其后一个节点,然后释放要删除节点的内存空间。

2025-03-18 12:10:03 406

原创 C语言顺序表

顺序表是C语言中一种常用的数据结构,以下是关于它的基本介绍: 定义 顺序表是在计算机内存中以数组形式存储的线性表。它用一组连续的存储单元依次存储线性表中的数据元素,使得逻辑上相邻的元素在物理位置上也相邻。 特点 - 随机访问:可以通过数组下标直接访问顺序表中的任意元素,时间复杂度为O(1)。 - 存储密度高:因为顺序表中数据元素是连续存储的,所以存储空间的利用率较高。 - 插入和删除操作效率低:在顺序表中插入或删除元素时,需要移动大量的元素,时间复杂度为O(n)。 基本操作 - 初始化:为顺序表分配内存空间

2025-03-18 12:09:18 230

原创 malloc 、 calloc 或 realloc 函数分配内存时返回的指针。

返回值:成功时返回指向调整后内存块的指针,可能与原指针相同,也可能不同(因为可能需要移动内存);- 返回值:成功时返回指向分配内存起始地址的指针,失败时返回 NULL。例如, int *ptr = (int *)malloc(10 * sizeof(int));- 返回值:成功时返回指向已初始化内存的指针,失败时返回 NULL。这些函数返回的指针是程序中操作动态分配内存的关键,通过它们可以访问和修改分配的内存空间,但使用完后需用 free 函数释放,以避免内存泄漏。

2025-03-17 15:54:52 215

原创 C语言里free怎么使用

只能释放由 malloc 、 calloc 或 realloc 分配的内存,否则会导致未定义行为。ptr 是之前通过 malloc 、 calloc 或 realloc 函数分配内存时返回的指针。- 释放内存后,应将指针设置为 NULL ,防止成为野指针,继续使用野指针会导致程序出现错误。在C语言中, free 函数用于释放动态分配的内存。printf("内存分配失败\n");ptr = NULL;// 防止出现野指针。- 不要多次释放同一块内存,否则也会导致未定义行为。

2025-03-17 15:53:44 221

原创 C语言里数组初始化时没放满,剩下的空间会怎么样

记得在C语言中,如果初始化数组时提供的初始值少于数组的元素数量,剩下的元素会被自动初始化为0或者默认值,具体取决于数组的类型和存储类别。但如果是自动数组,情况可能不同,因为自动数组的初始化是可选的,未显式初始化的元素可能保持原来的内存值,也就是不确定的值。举个例子,比如定义一个int数组,全局声明的话,初始化部分元素后,剩下的会被自动补0。总结一下,回答的结构应该是先说明规则,然后分情况讨论全局和局部数组的不同处理方式,再举例子说明,最后给出注意事项,比如避免使用未初始化的自动数组元素。

2025-03-06 12:31:03 135

原创 C语言fputs

fputs 是C语言中 <stdio.h> 标准输入输出库的函数,用于向文件流中写入字符串。以下是详细介绍: 函数原型 int fputs(const char *str, FILE *stream); - str 是要写入的字符串的指针,它可以是一个字符串常量,也可以是一个字符数组名或指向字符数组的指针。 - stream 是指向 FILE 类型的指针,指定要写入的文件流,可以是标准输出流 stdout ,也可以是通过 fopen 等函数打开的文件流。 返回值 - 成功写入时,返回一个非负整数。

2025-03-06 11:06:48 193

原创 C语言fgetc

在上述代码中,通过 fgetc 函数从文件 test.txt 中逐个读取字符,并使用 putchar 函数输出到标准输出。stream 是指向 FILE 类型的指针,用于指定要读取的文件流,可以是标准输入流 stdin ,也可以是通过 fopen 等函数打开的文件流。- 发生错误时,也返回 EOF ,可以通过 ferror 函数来判断是否是错误导致的返回 EOF。- 成功读取时,返回读取到的字符,返回值会自动提升为 int 类型。// 读取并输出文件内容,每次读取一个字符。

2025-03-06 11:06:08 349

原创 C语言的预处理

提高代码可维护性和可移植性:通过 #define 定义常量和宏,当需要修改常量值或宏的逻辑时,只需在定义处修改。通过条件编译,可以根据不同的平台或编译选项,包含不同的代码,使代码能在多种环境下运行。- 方便代码复用: #include 指令允许将常用的函数、变量声明等放在头文件中,多个源文件可以包含同一个头文件,实现代码复用。- 首先,预处理程序按从源文件开头到结尾的顺序对源文件进行扫描,识别预处理指令。- 遇到 #include 指令时,预处理程序将指定头文件的内容插入到当前位置。

2025-03-05 20:03:26 126

原创 C语言的“流”

在C语言中,“流”是一种抽象的概念,用于表示数据的输入输出通道,它提供了一种统一的方式来处理不同类型的输入输出操作,如文件操作、控制台输入输出等。- 全缓冲:数据先被存储在缓冲区中,当缓冲区满或者执行 fflush 函数、关闭流等操作时,才将缓冲区中的数据真正写入到输出设备或从输入设备读取到缓冲区。- 行缓冲:数据按行进行缓冲,当遇到换行符或者缓冲区满等情况时,才进行实际的输入输出操作。- 无缓冲:数据不经过缓冲区,直接进行输入输出操作,如 stderr 通常是无缓冲的,以便错误信息能及时输出。

2025-03-05 20:02:41 392

原创 C语言free

释放正确的指针: free 函数的参数必须是先前通过 malloc 、 calloc 或 realloc 函数分配内存时返回的指针,或者是 NULL 指针。- 防止悬空指针:在使用 free 函数释放内存后,该指针所指向的内存空间已被释放,但指针本身仍然保存着原来的地址值,成为悬空指针。为避免这种情况,通常在调用 free 函数后,将指针赋值为 NULL。当动态分配的内存不再需要时,使用 free 函数将其释放,以便系统可以将这部分内存重新分配给其他程序使用,防止内存泄漏。// 使用分配的内存。

2025-03-03 18:17:21 148

原创 C语言柔性数组

柔性数组是C语言中结构体里的一种特殊数组,它允许结构体中的数组长度不固定,最后一个元素是一个长度为0或不指定长度的数组。- 其特点是在结构体中不占实际的存储空间,结构体的大小仅包含其前面的成员变量大小,数组的空间可在运行时动态分配。- 实现动态长度的数据结构:可根据实际需求灵活调整数组大小,用于创建长度可变的数据结构,如动态数组、链表节点等。- 内存使用高效:避免了固定大小数组可能导致的内存浪费或不足问题,可按需分配内存,提高内存利用率。// 柔性数组,也可写成 int data[];

2025-03-03 18:16:45 290

原创 C语言运行环境

集成开发环境(IDE):将编辑器、编译器、调试器等工具集成在一起,如Visual Studio、Eclipse CDT、Code::Blocks等,帮助开发者更高效地进行C语言程序的开发、调试和管理。- 标准库:C语言标准库包含了大量的函数和工具,如输入输出函数、数学函数等,为程序员提供了丰富的功能支持,如Windows下的MSVCRT库,Linux下的glibc库。- 操作系统:常见的如Windows、Linux、macOS等,为C语言程序提供了底层的支持,包括内存管理、进程管理、文件系统管理等。

2025-02-26 16:32:54 230

原创 C语言语义分析器

C 语言语义分析器是编译器的一个重要组成部分,用于检查源程序的语义正确性,比如类型检查、作用域分析等。示例代码:这里仅简单示意类型检查部分,假设已构建好简单语法树结构,节点有表示类型和值的字段。if (node->type == 1) { // 假设 1 表示操作符。// 节点类型,如变量、常量、操作符等。int value;// 简单构建语法树示例,这里构建一个简单加法表达式树。// 简单类型检查函数示例,这里简单假设只有整数类型。// 对操作符节点检查左右子节点类型。// 简单语法树节点结构示例。

2025-02-26 16:32:15 426

原创 C语言语法分析器

在C语言编译流程中,词法分析器先把源程序的字符流分割成一个个单词,语法分析器则基于词法分析得到的单词序列,依据C语言的语法规则(如变量声明、语句结构、表达式规则等)来判断其语法结构是否正确。C语言语法分析器是编译过程中的关键组件,用于检查C语言源程序的语法结构是否正确,并构建相应的语法树。这只是一个非常简化的示例,实际的C语言语法分析器要处理更复杂的语法结构,如变量声明、函数定义、控制语句( if 、 for 、 while 等)、数据类型等,并且会使用更高效和复杂的算法来实现。1. 语法分析器的作用。

2025-02-25 22:25:06 467

原创 C语言链接过程中的重定位

相对重定位:基于某个基地址计算地址偏移量,程序加载到不同内存位置时,只需改变基地址,内部地址关系不变,提高了程序的可移植性和灵活性,是现代链接中常用的方式。- 符号解析:链接器处理目标文件时,会解析符号引用,找到符号定义,确定其在最终可执行文件中的地址,若符号在多个目标文件中有定义,链接器会按规则选择。链接器读取这些信息,确定需重定位的位置和符号。- 地址调整:链接器根据符号的最终地址,对目标文件中需重定位的位置进行地址调整,修改指令和数据中的地址值,使其指向正确内存位置。

2025-02-25 22:24:07 669

原创 C语言编译

把编译阶段生成的汇编代码转换为目标机器的机器语言指令,生成目标文件。- 合并目标文件和库文件:将多个目标文件以及程序中用到的库文件进行合并。- 符号解析:对目标文件中的符号引用进行解析,确定每个符号的实际地址。- 生成可执行文件:将合并和解析后的内容进行整理,生成最终的可执行文件,在Windows上一般为 .exe 格式,在Linux上通常没有特定后缀。} ,会因缺少括号而被检测出语法错误。- 语义分析:检查语法结构的语义是否正确,如对变量和函数的声明与使用进行匹配检查,看是否存在类型不匹配等问题。

2025-02-24 20:46:32 395

原创 C语言预处理

#if 、 #elif 、 #else 、 #endif 可根据表达式的值进行条件编译。- #ifdef 、 #ifndef 、 #else 、 #endif 等指令可根据条件决定是否编译部分代码。如 #define MAX(a,b) ((a)>(b)?

2025-02-24 20:45:27 463

原创 常见的动态内存的错误

原因:在使用 malloc 等函数分配内存时,如果分配失败(例如系统内存不足),程序没有进行适当的错误处理,而是继续使用返回的 NULL 指针。- 原因:指针所指向的内存已经被释放,但程序中仍然保留着这个指针并继续使用它,此时该指针成为悬空指针,可能导致程序访问到非法内存地址。- 原因:程序分配了内存但在使用完毕后没有及时释放,导致这部分内存无法再被程序使用,随着程序运行,可用内存逐渐减少。- 原因:对同一块已经释放的内存再次进行释放操作,这会破坏内存管理机制,导致程序出现错误。

2025-02-23 23:30:25 108

原创 对malloc的理解

malloc 函数在 <stdlib.h> 头文件中声明,原型为 void *malloc(size_t size) , size 参数指定要分配的字节数,函数返回一个 void* 类型的指针,指向分配内存块的起始地址。- 优化内存使用:程序可按需分配内存,避免静态分配导致的内存浪费,在内存资源有限的嵌入式系统或大型程序中,能有效提高内存利用率。- 避免越界访问:对 malloc 分配的内存操作时,要确保不超出分配的内存边界,否则会导致不可预测的行为。// 输出内存中的数据。// 使用分配的内存。

2025-02-23 23:29:38 294

原创 C语言结构体的内存分配

,先为 int 类型的成员 a 分配4字节空间,接着为 char 类型的成员 b 分配1字节空间,最后为 float 类型的成员 c 分配4字节空间。在一般的32位系统中,上述代码输出的结构体大小通常为8字节,因为 char 类型的 a 占1字节, int 类型的 b 占4字节, short 类型的 c 占2字节,但由于内存对齐, a 后面会填充3字节,使 b 的地址是4的倍数,所以整个结构体大小为8字节。例如,一个包含 char 类型成员和 int 类型成员的结构体,总大小可能是8字节而不是5字节。

2025-02-22 17:01:54 438

原创 位段和结构体的区别

结构体:成员按声明顺序存储,各成员之间可能存在内存对齐,以满足硬件访问要求,会浪费一定内存空间。- 结构体:是一种用户自定义的数据类型,可将不同类型的数据成员组合在一起,形成一个新的复合数据类型,用于表示具有多种属性的对象。- 位段:是结构体的一种特殊形式,它允许在结构体中以位为单位来指定成员的宽度,用于对数据的二进制位进行更精细的控制。如一个包含两个4位位段的结构体,只占1字节。- 位段:也通过成员运算符访问,但操作针对指定的位域,可方便对特定位进行置位、清零、测试等操作。

2025-02-22 17:01:13 148

原创 C语言浮点数存储

符号位S为0,指数E为1 + 127 = 128,即二进制的10000000,尾数位M为1001后面补19个0。- 尾数位(M):单精度浮点数中占23位,双精度浮点数中占52位。尾数位存储的是浮点数的小数部分,隐藏了最高位的1,实际存储的是1.M的小数部分M。- 指数位(E):单精度浮点数中占8位,双精度浮点数中占11位。指数用移码表示,单精度的偏移量为127,双精度的偏移量为1023。- 符号位(S):占1位,0表示正数,1表示负数。- 朝0舍入:直接截断小数部分,向0的方向舍入。

2025-02-21 21:03:25 222

原创 C语言整数存储

通常 char 占1个字节, short 占2个字节, int 一般占4个字节, long 在32位系统占4个字节,64位系统占64个字节, long long 占8个字节。- 无符号整数类型:在上述类型前加 unsigned ,如 unsigned char 、 unsigned int 等,无符号整数只能表示非负整数,取值范围是0到2的n次方减1,n为该类型占用的位数。如-5的补码是11111011。- 反码:正数的反码与原码相同,负数的反码是在原码的基础上,符号位不变,其余位取反。

2025-02-21 21:02:47 198

原创 自定义类型结构体

声明方式:使用关键字 struct ,后接结构体名称(也可省略形成匿名结构体,但匿名结构体基本只能使用一次),大括号内是成员列表,末尾大括号后可跟变量名列表。- 初始化:创建结构体变量后需初始化,可按成员顺序赋值,如 struct Student stu = {"Alice", 20, "Female"};也可指定成员赋值,如 struct Student stu = {.age = 22, .name = "Bob", .sex = "Male"};

2025-02-20 13:22:15 253

原创 浮点数在内存中的存储

存入内存时,E的真实值需加上中间数(8位E加127,11位E加1023 )。例如,2^{10}的E是10,保存成32位浮点数时存为10 + 127 = 137,即10001001。- 有效数字M:计算机内部保存M时,默认其第一位总是1,可舍去,只保存后面小数部分,读取时再加上。- 64位浮点数:最高1位存符号位S,接着11位存指数E,剩下52位存有效数字M。- 32位浮点数:最高1位存符号位S,接着8位存指数E,剩下23位存有效数字M。- 符号位S:决定浮点数正负,S = 0时,V为正数;

2025-02-20 13:21:34 467

原创 C语言大小端

然后检查 *p 的值,如果 *p 等于 1 ,说明最低地址处存储的是 1 ,也就是数据的低位字节存放在内存的低地址处,所以是小端模式,函数返回 1;定义了一个整数 num 并初始化为 1 ,由于 int 类型通常是 4 个字节,在内存中存储时,若为小端模式,最低位字节存储 1 ,其余字节为 0;若为大端模式,最高位字节存储 1 ,其余字节为 0。小端模式(Little-Endian)则相反,数据的低位字节存放在内存的低地址处,高位字节存放在内存的高地址处。

2025-02-19 15:14:55 331

原创 C语言正反码

get_original_code 、 get_complement_code 和 get_two_complement_code 函数分别用于获取一个整数的原码、反码和补码。在 main 函数中,对一个负数(这里是 -5)进行了原码、反码和补码的获取和打印展示。反码:正数的反码与原码相同;负数的反码是在其原码的基础上,符号位不变,其余各位取反。原码:最高位为符号位(0 表示正数,1 表示负数),其余位表示数值的绝对值。补码:正数的补码与原码相同;负数的补码是在其反码的基础上,末位加 1。

2025-02-19 15:14:03 662

原创 C语言指针

这里的 * 表示这是一个指针变量, int 表示该指针所指向的数据类型。在使用指针之前,通常将其初始化为 NULL ,以避免悬挂指针(指向已释放内存的指针)问题。指针是一个变量,其值为另一个变量的地址,即内存位置的直接地址。指针作为函数参数:指针可以作为函数参数传递,这样可以在函数内部修改调用函数中变量的值,实现“传址调用”。通过指针访问变量:可以使用间接访问操作符 * (也称为解引用操作符)来访问指针所指向的变量的值。指针的赋值:要使指针指向一个变量,使用取地址操作符 &。

2025-02-18 11:44:40 545

原创 C语言操作符

关系操作符:用于比较运算,包括 > (大于)、 < (小于)、 >= (大于等于)、 <= (小于等于)、 == (等于)、!还有复合赋值操作符,如 += 、 -= 、 *= 、 /= 、 %= 等。位操作符:对二进制位进行操作,包括 & (按位与)、 | (按位或)、 ^ (按位异或)、 ~ (按位取反)、 << (左移)、 >> (右移)。单目操作符:只需要一个操作数,如 ++ (自增)、 -- (自减)、 + (正号)、 - (负号)、 sizeof (求数据类型或变量大小)等。

2025-02-18 11:43:57 250

原创 C语言指针

这里 ptr 就是一个指向 int 类型的指针变量,可通过 ptr = # 让 ptr 存储 num 的地址。- 解引用操作:通过 * 运算符访问指针所指向的变量的值,如 int num = 10;- 指针作为函数参数:可将变量的地址传递给函数,使函数能直接操作调用函数中的变量。如指针变量未初始化就使用,或指针所指向的内存已被释放仍在使用,都会产生野指针,可能导致程序崩溃或出现不可预测的结果。,如 float *p;- 返回指针的函数:前面提到的指针函数,返回一个指针,可用于动态内存分配等场景。

2025-02-16 19:28:14 233

原创 C语言指针函数

在函数内部,使用 malloc 函数动态分配了一块内存空间,然后将数组元素赋值为1到 size 的整数,最后返回指向该数组的指针。其中, 类型说明符 表示返回的指针所指向的数据类型, * 表示这是一个指针函数, 函数名 是函数的标识符, 参数列表 用于指定函数接受的参数。例如: int *func(int a, int b) ,该函数名为 func ,接受两个 int 类型的参数,返回一个指向 int 类型数据的指针。比如返回一个指向结构体的指针,结构体中可以包含多个成员,从而实现类似多返回值的功能。

2025-02-16 19:26:23 184

原创 memmove

memmove 能够正确处理源内存区域和目标内存区域重叠的情况,保证数据移动的准确性。例如,当源区域和目标区域有部分重叠时, memmove 会先将源区域的数据复制到一个临时位置,然后再从临时位置复制到目标区域,以避免数据覆盖导致的错误。- dest :指向目标内存区域的指针,数据将被移动到这个位置。- src :指向源内存区域的指针,数据将从这个位置被移动。// 如果源地址小于目标地址,从后往前复制。函数返回指向目标内存区域 dest 的指针。// 让源区域和目标区域重叠。

2025-02-15 20:17:58 129

原创 memcpy的使用和模拟实现

在上述模拟实现中,先将 void 类型的指针转换为 char 类型的指针,因为 char 类型指针可以按字节进行操作。然后通过循环,逐个字节地将源内存区域的数据复制到目标内存区域,最后返回目标内存区域的指针。需要注意的是,上述模拟实现没有处理源内存区域和目标内存区域重叠的情况,而标准库中的 memcpy 函数是不处理重叠情况的,处理重叠情况的是 memmove 函数。memcpy 是 C 标准库中的一个函数,用于从源内存区域复制指定长度的字节数据到目标内存区域。

2025-02-15 20:17:25 236

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除