首页 > 系统相关 >C语言内存函数精讲

C语言内存函数精讲

时间:2024-07-27 23:53:17浏览次数:11  
标签:函数 int 精讲 memcpy C语言 内存 include void

目录

引言

1.内存分配函数malloc

2.内存释放函数free

3.内存拷贝函数memcpy

4.内存移动函数memmove

5.内存设置函数memset

6.内存比较函数memcmp

总结 


引言

在C语言编程中,内存管理是核心技能之一。C语言提供了一系列内存操作函数,这些函数在动态内存分配、数据拷贝和比较等方面发挥着重要作用。本文将详细介绍这些内存函数的用法和注意事项。

1.内存分配函数malloc

malloc用于动态分配指定大小的内存空间。原型如下:

void *malloc(size_t size);

size:需要分配的内存字节数。
返回值:成功时返回指向分配内存的指针,失败时返回NULL。

使用示例:

#define  _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int main() {
    int* array = (int*)malloc(sizeof(int) * 10);
    if (array == NULL) {
        printf("Memory allocation failed!\n");
        return -1;
    }
    // 使用分配的内存
    for (int i = 0; i < 10; i++) {
        array[i] = i;
    }
    free(array); // 释放内存
    return 0;
}

2.内存释放函数free

free用于释放动态分配的内存空间。原型如下:

void free(void *ptr);

ptr:指向需要释放的内存空间。

使用示例同上。

3.内存拷贝函数memcpy

memcpy用于将一块内存内容拷贝到另一块内存。从功能上看可以取代strcpy函数。原型如下:

void *memcpy(void *dest, const void *src, size_t n);

dest:目标内存地址。
src:源内存地址。
n:需要拷贝的字节数。
返回值:成功时返回指向目标内存的指针。

使用示例:

#define  _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main()
{
	int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
	int arr2[10] = { 0 };
	memcpy(arr2, arr1, 40);//将arr1数组内容复制到arr2
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr2[i]);
	}
	return 0;
}

运行结果:

4.内存移动函数memmove

memmove用于将一块内存内容移动到另一块内存,即使源内存和目标内存有重叠也能正确执行。和memcpy的差别就是memmove函数处理的源内存块和⽬标内存块是可以重叠的。 原型如下:

void *memmove(void *dest, const void *src, size_t n);

dest:目标内存地址。
src:源内存地址。
n:需要移动的字节数。
返回值:成功时返回指向目标内存的指针。

使用示例: 

#define  _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main()
{
	int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
	memmove(arr1 + 2, arr1, 20);//将从下标0处开始的5个整形数据移动到下标2开始的位置
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr1[i]);
	}
	return 0;
}

运行结果:

5.内存设置函数memset

memset用于将一块内存设置为一个指定的值。原型如下:

void *memset(void *s, int ch, size_t n);

s:需要设置的内存地址。
ch:需要设置的值。
n:需要设置的内存字节数。
返回值:成功时返回指向目标内存的指针。 

 使用示例:

#define  _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main()
{
	char str[] = "hello world";
	memset(str, 'x', 6);//将前面6个字符设置为x
	printf(str);
	return 0;
} 

运行结果:

6.内存比较函数memcmp

memcmp用于比较两块内存内容的前n个字节。原型如下:

int memcmp(const void *s1, const void *s2, size_t n);

s1:第一块内存地址。
s2:第二块内存地址。
n:需要比较的字节数。
返回值:小于0、等于0或大于0,取决于比较结果。

 使用示例:

#define  _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main()
{
	char buffer1[] = "DWgaOtP12df0";
	char buffer2[] = "DWGAOTP12DF0";
	int n;
	n = memcmp(buffer1, buffer2, sizeof(buffer1));
	if (n > 0)
		printf("'%s' is greater than '%s'.\n", buffer1, buffer2);
	else if (n < 0)
		printf("'%s' is less than '%s'.\n", buffer1, buffer2);
	else
		printf("'%s' is the same as '%s'.\n", buffer1, buffer2);
	return 0;
}

 运行结果:

总结 

本文介绍了C语言中的内存操作函数,包括内存分配(malloc)、内存释放(free)、内存拷贝(memcpy)、内存移动(memmove)、内存设置(memset)以及内存比较(memcmp)。掌握这些函数,可以让C语言程序员更加高效地处理内存相关的任务。在使用这些函数时,需要注意内存泄漏、内存越界和内存重叠等问题,以确保程序的安全性和稳定性。

标签:函数,int,精讲,memcpy,C语言,内存,include,void
From: https://blog.csdn.net/2302_81410974/article/details/140743221

相关文章

  • 【C语言】结构体
    目录一、结构体概念二、定义结构体类型三、定义和引用结构体类型变量3.1 先定义结构体类型再定义变量名3.2 在定义类型的同时定义变量3.3直接定义结构类型变量3.4类型与变量区别   3.5结构体的嵌套定义   3.6结构体类型变量的引用3.7 结构体类型......
  • C语言——字符串拼接strcat及自实现代码
    strcat函数在C语言中,strcat函数用于将两个字符串连接起来,即将源字符串(sourcestring)追加到目标字符串(destinationstring)的末尾,并返回目标字符串。这个函数定义在头文件<string.h>中。函数原型如下:char*strcat(char*dest,constchar*src);dest:目标字符串的指针,这个字符......
  • 数据结构——链式二叉树(C语言版)
    链式二叉树的结构⽤链表来表⽰⼀棵⼆叉树,即⽤链来指⽰元素的逻辑关系。通常的⽅法是链表中每个结点由三个域组成,数据域和左右指针域,左右指针分别⽤来给出该结点左孩⼦和右孩⼦所在的链结点的存储地址。                                ......
  • 学习c语言第十五天(初阶测评)
    选择题1.下列程序输出结果为672.下列程序输出结果为 死循环打印3.i和j的值分别为什么 214.k的终值是什么905.输出结果是什么 16.正确的是    C7.C语言规定main函数位置    C8.不正确的是    D9.正确的是     c ......
  • C语言初阶(6)
    1.函数递归定义程序调用自身的编程技巧称为递归。递归做为一种算法在程序设计语言中广泛应用。一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可......
  • 15.C语言形式参数和实际参数的介绍及函数总结
    形参和实参的介绍及函数总结1.形式参数和实际参数2.获取两个最大的数3.关于函数的一些总结1.形式参数和实际参数实际参数可以是常量、变量、表达式y=get(1);//常量y=get(x);//变量y=get(x+1);//表达式形参和实参数值相同,地址不同(传递参数是数值的传递......
  • C语言程序设计核心详解 第八章 指针超详细讲解_指针变量_二维数组指针_指向字符串指针
    写在最前,一篇文章学会C语言指针顶级重要,学习C语言最重要的一部分-------指针第八章指针超详细讲解_指针变量_二维数组指针_指向字符串指针文章目录写在最前,一篇文章学会C语言指针第八章指针超详细讲解_指针变量_二维数组指针_指向字符串指针1.指针变量1.1指针变......
  • C语言的函数递归
    一、递归的意义所谓函数递归,就是在某个函数中再次调用这个函数本身,做到函数自己调用自己,这个就是函数的递归。而函数的递归主要是的作用是将一个本身比较复杂,并且步骤繁多的函数逐次的递归使其变得简单化,就比如剥笋:我们想要得到里面能吃的部分,就需要剥笋。而笋的皮有很多层,每......
  • 入门C语言Day18——break&continue&goto语句
    前面的博文中有提到do-while与for循环语句,其中的流程图中有break和continue这两个部分还没解释。所以今天先来解释一下break与continue语句。break和continue两个关键字都被运用在循环中。break的作用是永久的终止循环,只要break被执行,直接就会跳出循环,继续往后执行。......
  • 写一个函数返回参数二进制中1的个数(c语言)
    1.int一共有32位,我们要知道一个数取余2等于1(n%2==1),就可以得到二进制中1的个数.然后一个数除于2(n=n/2),就可以使32位向右一位(例如:5为101,5/2==2,2为10,)。方法1(不可以输入负数)//写一个函数返回参数二进制中1的个数//方法1intcount(intn,intz){ //当a为正数的 if(n>......