C语言内存操作函数详解

C语言内存操作函数详解

C语言是一门近乎底层的编程语言,与其他高级编程语言相比,C语言提供了更加精细的内存操作功能。C语言内存操作函数可以分为以下四类:

  • 内存拷贝函数
  • 内存比较函数
  • 内存设置函数
  • 内存分配和释放函数

下面将详细讲解这些函数。

一、内存拷贝函数

memcpy()memmove()strcpy()函数都可以进行内存拷贝的操作。其中,memcpy()memmove()函数主要用于拷贝内存块,而strcpy()函数则用于字符串的复制。

1. memcpy()

memcpy()函数用于内存块的拷贝,其函数原型为:

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

其中,dest表示目标内存的起始位置地址,src表示源内存的起始位置地址,n表示需要拷贝的字节数。调用memcpy()函数时,函数会将src指向的内存块中的前n个字节拷贝到dest指向的内存块中。

下面是一个使用memcpy()函数的示例代码:

#include <stdio.h>
#include <string.h>

int main()
{
    char str1[] = "Hello";
    char str2[] = "World";

    printf("Before memcpy(): str1 = %s, str2 = %s\n", str1, str2);

    memcpy(str1, str2, strlen(str2) + 1);

    printf("After memcpy(): str1 = %s, str2 = %s\n", str1, str2);

    return 0;
}

在上述代码中,memcpy()函数被用于将字符串str2拷贝到字符串str1中。

2. memmove()

memmove()函数同样用于内存块的拷贝,其函数原型为:

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

memmove()memcpy()函数的区别在于,memmove()函数可以处理内存块的重叠情况,而memcpy()则不能。具体来说,当源内存块与目标内存块部分或全部重叠时,memmove()函数能够正确地将源内存块拷贝到目标内存块中。而memcpy()函数则没有处理重叠情况的能力。

下面是一个使用memmove()函数的示例代码:

#include <stdio.h>
#include <string.h>

int main()
{
    char str[] = "abcdefgh";

    printf("Before memmove(): str = %s\n", str);

    memmove(str + 2, str, strlen(str) + 1);

    printf("After memmove(): str = %s\n", str);

    return 0;
}

在上述代码中,memmove()函数被用于将字符串str中的所有字符向右移动两个位置,即插入了两个空格。

二、内存比较函数

C语言提供了三个内存比较函数,即memcmp()strcmp()strncmp()函数。其中,memcmp()函数用于比较两个内存块,而strcmp()strncmp()函数则用于比较两个字符串。

1. memcmp()

memcmp()函数用于比较两个内存块的内容,其函数原型为:

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

其中,s1s2分别表示需要比较的两个内存块,n表示需要比较的字节数。当s1指向的内存块等于s2指向的内存块时,返回值为0;当s1指向的内存块大于s2指向的内存块时,返回值大于0;当s1指向的内存块小于s2指向的内存块时,返回值小于0。

下面是一个使用memcmp()函数的示例代码:

#include <stdio.h>
#include <string.h>

int main()
{
    char str1[] = "Hello";
    char str2[] = "World";

    int result = memcmp(str1, str2, 3);

    if (result > 0)
    {
        printf("str1 is greater than str2\n");
    }
    else if (result < 0)
    {
        printf("str1 is less than str2\n");
    }
    else
    {
        printf("str1 is equal to str2\n");
    }

    return 0;
}

在上述代码中,memcmp()函数被用于比较字符串str1和字符串str2中的前三个字符。

2. strcmp()

strcmp()函数用于比较两个字符串的内容,其函数原型为:

int strcmp(const char* s1, const char* s2);

其中,s1s2分别表示需要比较的两个字符串。当s1字符串等于s2字符串时,返回值为0;当s1字符串大于s2字符串时,返回值大于0;当s1字符串小于s2字符串时,返回值小于0。

下面是一个使用strcmp()函数的示例代码:

#include <stdio.h>
#include <string.h>

int main()
{
    char str1[] = "Hello";
    char str2[] = "World";

    int result = strcmp(str1, str2);

    if (result > 0)
    {
        printf("str1 is greater than str2\n");
    }
    else if (result < 0)
    {
        printf("str1 is less than str2\n");
    }
    else
    {
        printf("str1 is equal to str2\n");
    }

    return 0;
}

在上述代码中,strcmp()函数被用于比较字符串str1和字符串str2

3. strncmp()

strncmp()函数同样用于比较两个字符串的内容,但与strcmp()函数不同的是,strncmp()函数只比较两个字符串中的前n个字符,其函数原型为:

int strncmp(const char* s1, const char* s2, size_t n);

下面是一个使用strncmp()函数的示例代码:

#include <stdio.h>
#include <string.h>

int main()
{
    char str1[] = "Hello, world!";
    char str2[] = "Hello, China!";

    int result = strncmp(str1, str2, 6);

    if (result > 0)
    {
        printf("str1 is greater than str2\n");
    }
    else if (result < 0)
    {
        printf("str1 is less than str2\n");
    }
    else
    {
        printf("str1 is equal to str2\n");
    }

    return 0;
}

在上述代码中,strncmp()函数被用于比较字符串str1和字符串str2中的前六个字符。

三、内存设置函数

memset()函数用于将指定内存块的前n个字节设置成某个特定的值,其函数原型为:

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

其中,s表示需要设置的内存块的起始位置地址,c表示需要设置的值,n表示需要设置的字节数。

下面是一个使用memset()函数的示例代码:

#include <stdio.h>
#include <string.h>

int main()
{
    char str[] = "Hello";

    printf("Before memset(): str = %s\n", str);

    memset(str, 'a', 3);

    printf("After memset(): str = %s\n", str);

    return 0;
}

在上述代码中,memset()函数被用于将字符串str中的前三个字符设置成字符a

四、内存分配和释放函数

C语言提供了两个内存分配和释放函数,即malloc()free()函数。其中,malloc()函数用于动态分配内存,而free()函数则用于释放已经分配的内存。

1. malloc()

malloc()函数用于动态分配内存,其函数原型为:

void* malloc(size_t size);

其中,size参数表示需要分配的内存大小。malloc()函数会在堆上分配一个连续的内存块,并将其起始地址返回。如果分配失败,函数会返回NULL

下面是一个使用malloc()函数的示例代码:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int* num_ptr;

    num_ptr = (int*)malloc(3 * sizeof(int));

    if (num_ptr == NULL)
    {
        printf("Memory allocation failed\n");
        exit(1);
    }

    num_ptr[0] = 10;
    num_ptr[1] = 20;
    num_ptr[2] = 30;

    printf("The numbers are: %d, %d, %d\n", num_ptr[0], num_ptr[1], num_ptr[2]);

    free(num_ptr);

    return 0;
}

在上述代码中,malloc()函数被用于动态分配大小为3个int型变量所需的内存,并将返回的起始地址转换为int*类型指针。然后,通过指针对该内存块进行读写操作。最后,在程序结束前,使用free()函数释放该内存块。

2. free()

free()函数用于释放已经分配的内存,其函数原型为:

void free(void* ptr);

其中,ptr参数表示需要被释放的内存的起始地址。释放内存后,该指针仍然指向已释放的内存区域,因此在释放内存后,必须将其置为NULL

下面是一个使用free()函数的示例代码:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int* num_ptr;

    num_ptr = (int*)malloc(3 * sizeof(int));

    if (num_ptr == NULL)
    {
        printf("Memory allocation failed\n");
        exit(1);
    }

    num_ptr[0] = 10;
    num_ptr[1] = 20;
    num_ptr[2] = 30;

    printf("The numbers are: %d, %d, %d\n", num_ptr[0], num_ptr[1], num_ptr[2]);

    free(num_ptr);

    num_ptr = NULL;

    return 0;
}

在上述代码中,free()函数被用于释放已经分配的内存块,并将指针num_ptr置为NULL

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言内存操作函数详解 - Python技术站

(0)
上一篇 2023年6月26日
下一篇 2023年6月26日

相关文章

  • 教你如何用cmd快速登录服务器

    使用CMD快速连接服务器的步骤如下: 1. 打开CMD窗口 在Windows系统中,打开“开始菜单”,在搜索框中输入“cmd”,然后点击打开“命令提示符”窗口。 2. 连接目标服务器 在CMD窗口中输入如下命令: ssh [username]@[server_address] 其中,[username]是你要登录到服务器的用户名,[server_addres…

    other 2023年6月26日
    00
  • 详解React项目的服务端渲染改造(koa2+webpack3.11)

    详解React项目的服务端渲染改造(koa2+webpack3.11) 1. 概述 本文将介绍如何将一个React项目改造成服务端渲染的形式,并使用Koa2和webpack3.11完成。 服务端渲染的好处是能够提高网站的SEO和首屏渲染速度,并且能够更好地应对一些搜索引擎不友好的单页面应用(SPA)。通过本文,你将掌握如何在一个React项目中加入服务端渲染…

    other 2023年6月27日
    00
  • 一篇带你了解C语言–位操作详情

    一篇带你了解C语言–位操作详情 介绍 在计算机中,二进制位(bit)是计算机内部处理数据的最小单位。C语言提供了位操作运算符和函数,用于操作和处理二进制位数据类型(int, char, short等)。 本文将带您了解C语言中的位操作,包括位运算符、位移动运算符以及位操作函数,并提供相关示例。 位运算符 按位与(&) 按位与运算符(&)比较…

    other 2023年6月27日
    00
  • Android自定义View Material Design理念详解

    Android自定义View Material Design理念详解 Material Design是Google于2014年推出的一种设计语言,旨在提高Android应用程序的用户体验。 Material Design的重点是在设计中引入更多的动画效果、阴影、形状和颜色等元素。在Android应用中,自定义View是实现Material Design理念不…

    other 2023年6月25日
    00
  • 网络中常见的IP地址疑难问题解答

    网络中常见的IP地址疑难问题解答攻略 1. IP地址的分类 在网络中,IP地址是用于标识设备的唯一地址。IP地址分为IPv4和IPv6两种类型。 IPv4地址 IPv4地址由32位二进制数组成,通常以点分十进制表示。例如,192.168.0.1是一个IPv4地址。 IPv6地址 IPv6地址由128位二进制数组成,通常以冒号分隔的十六进制表示。例如,2001…

    other 2023年7月29日
    00
  • Android activity堆栈及管理实例详解

    Android Activity堆栈及管理实例详解 在Android开发中,Activity是应用程序的基本组件之一,用于展示用户界面和处理用户交互。Activity堆栈是指存储Activity实例的一种数据结构,用于管理Activity的生命周期和导航。 Activity堆栈的工作原理 Activity堆栈采用后进先出(LIFO)的原则,即最后一个进入堆栈…

    other 2023年8月26日
    00
  • 贾登峪-景点介绍

    以下是“贾登峪-景点介绍”的完整攻略: 贾登峪-景点介绍 贾登峪位于北京市怀柔区,是一处以自然风光为主的旅游景区。本攻略将详介绍贾登峪的景点,包括贾登峪的位置、门票价格、景点介绍等。 贾登峪的位置 贾登峪于北京市怀柔区,距离北京中心约70里,交通便利。可以乘坐公交车或自驾前往。 贾登峪的门票价格 贾登峪的门价格为60元/人,包含贾登峪景区内的所有景点。 贾登…

    other 2023年5月8日
    00
  • Samplitude Pro X3安装及汉化破解教程图解

    Samplitude Pro X3安装及汉化破解教程图解攻略 1. 下载Samplitude Pro X3安装文件 首先,你需要从官方网站或其他可信的软件下载站点下载Samplitude Pro X3的安装文件。确保你选择的是完整的安装文件,而不是试用版或其他版本。 2. 安装Samplitude Pro X3 按照以下步骤安装Samplitude Pro …

    other 2023年8月3日
    00
合作推广
合作推广
分享本页
返回顶部