C语言内存操作函数详解

yizhihongxing

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日

相关文章

  • Windows10在文件资源管理器中显示/隐藏文件扩展名(后缀名)

    Windows 10文件资源管理器中显示/隐藏文件扩展名(后缀名)攻略 在Windows 10的文件资源管理器中,你可以选择显示或隐藏文件的扩展名(也称为后缀名)。下面是详细的攻略,包含两个示例说明。 显示文件扩展名 要在文件资源管理器中显示文件扩展名,请按照以下步骤进行操作: 打开文件资源管理器。你可以通过按下Win + E键组合来快速打开它。 在文件资源…

    other 2023年8月5日
    00
  • Linux配置和使用i3窗口管理器的教程

    Linux配置和使用i3窗口管理器的教程 1. 什么是i3窗口管理器 i3是一个轻量级的窗口管理器,它使用平铺式的窗口布局,能够让你方便而快速地管理你的窗口。由于使用了平铺式布局,i3可以帮助你充分利用你的屏幕空间,从而提高你的工作效率。 2. 安装i3窗口管理器 在Ubuntu和Debian上安装i3窗口管理器可以通过以下命令: sudo apt-get …

    other 2023年6月20日
    00
  • python如何正确的操作字符串

    当处理文本和字符串时,Python是一种非常强大的语言。Python提供了很多内置的方法和函数,可以有效地处理和操作字符串。下面是正确操作字符串的完整攻略: 1. 创建字符串 在Python中创建字符串很简单,直接使用单引号、双引号或三引号都可以。例如: str1 = ‘hello world’ str2 = "hello world" …

    other 2023年6月20日
    00
  • 关于谷歌浏览器:“cache-control:max-age=0 无缓存”问题

    关于谷歌浏览器:“cache-control:max-age=0无缓存”问题的完整攻略 在使用谷歌浏览器时,有时会遇到“cache-control:max-age=0无缓存”问题。这是由于浏览器缓设置不正确导致的。本攻略将介绍如何解决这个问题。 步骤一:清除浏览器缓存 我们可以尝清除浏览器缓存,以解决“cache-control:max-age=0无缓存”问…

    other 2023年5月9日
    00
  • phpstorm—如何激活phpstorm2016

    PHPStorm – 如何激活PHPStorm 2016 PHPStorm是一个流行的PHP集成开发环境,开发人员可以使用它来编写、调试和部署PHP应用程序。但是,许多人在使用PHPStorm时遇到了一个问题 – 它需要激活许可证才能使用。在本文中,我们将讨论如何激活PHPStorm 2016。 1. 下载PHPStorm 2016 首先,您需要下载PHPS…

    其他 2023年3月28日
    00
  • MySQL中字符串函数详细介绍

    首先,我们需要了解MySQL中字符串函数的概念和作用。字符串函数是一类专门针对字符串型数据进行操作的函数,通过使用字符串函数可以对MySQL中的字符串数据进行合并、分割、替换、转换等各种操作。在本篇攻略中,我们将介绍一些常用的MySQL字符串函数及其使用方法,举例说明它们在实际开发中的应用。 字符串截取函数(SUBSTR) 字符串截取函数(SUBSTR)可以…

    other 2023年6月20日
    00
  • Win11怎么设置截图工具快捷键? Win11自定义截图快捷键的技巧

    在Windows 11中,你可以通过以下步骤设置截图工具的快捷键: 打开“设置”:点击任务栏上的“开始”按钮,然后点击“设置”图标(齿轮状图标)。 进入“系统”设置:在设置窗口中,点击左侧导航栏中的“系统”。 打开“截图和录制”设置:在系统设置中,点击左侧导航栏中的“截图和录制”。 设置快捷键:在“截图和录制”设置页面中,向下滚动找到“截图”部分。点击“更改…

    other 2023年8月5日
    00
  • 基于springboot bean的实例化过程和属性注入过程

    下面是对“基于Spring Boot Bean的实例化过程和属性注入过程”的完整攻略: 基于Spring Boot Bean的实例化过程 Spring Boot 是一款基于 Spring Framework 的快速开发 Web 项目的工具。而在 Spring Boot 中,Bean 的实例化过程非常重要。下面是 Spring Boot Bean 的实例化过程…

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