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日

相关文章

  • 软件开发基础之设计模式概述

    软件开发基础之设计模式概述攻略 1. 什么是设计模式? 设计模式是一种在软件开发中常用的解决问题的方法论。它们是经过多年实践总结出来的,可以帮助开发人员更好地组织和设计代码,提高代码的可读性、可维护性和可扩展性。 2. 设计模式的分类 设计模式可以分为三大类:创建型模式、结构型模式和行为型模式。 2.1 创建型模式 创建型模式关注对象的创建过程,包括如何实例…

    other 2023年7月27日
    00
  • Android开发获取手机内网IP地址与外网IP地址的详细方法与源码实例

    Android开发获取手机内网IP地址与外网IP地址的详细方法与源码实例 在Android开发中,我们可以使用以下方法获取手机的内网IP地址和外网IP地址。 获取内网IP地址 要获取手机的内网IP地址,我们可以使用WifiManager类。以下是获取内网IP地址的步骤: 在AndroidManifest.xml文件中添加以下权限: <uses-perm…

    other 2023年7月31日
    00
  • 为应用程序池 ‘DefaultAppPool’ 提供服务的进程关闭时间超过了限制

    此问题是由于IIS应用程序池的进程执行时间超过了设置的时间限制导致的。为了解决此问题,您可以采取以下步骤: 1. 增加应用程序池的进程关闭时间限制 可以通过增加应用程序池的进程关闭时间限制来解决此问题,以下是如何操作的步骤: 打开 IIS 管理器 导航到“应用程序池” 右键单击需要更改的应用程序池并选择“高级设置” 在“进程模型”部分中,找到”Shutdow…

    other 2023年6月25日
    00
  • 深入理解Asp.Net中WebForm的生命周期

    下面我将详细讲解“深入理解Asp.Net中WebForm的生命周期”的完整攻略。 1. Asp.Net中WebForm生命周期 WebForm是Asp.Net中的一种Web页面,其生命周期指的是从WebForm对象创建到最终对用户的响应这一过程中所经历的一系列事件,可以分为以下几个阶段: 页面类实例化阶段:在Asp.Net引擎收到一个Http请求后,首先会创…

    other 2023年6月27日
    00
  • SQL SERVER使用REPLACE将某一列字段中的某个值替换为其他的值

    要使用REPLACE函数将某一列字段中的某个值替换为其他的值,可以按照以下步骤进行操作: 首先需要连接到数据库,并选择需要操作的表。 接着,可以使用REPLACE函数来执行替换操作。REPLACE函数需要三个参数:要替换的原始字符串、要替换成的新字符串和原始字符串所在的列名。具体语法如下: UPDATE tableName SET columnName = …

    other 2023年6月25日
    00
  • phpmyadmin MySQL 加密配置方法

    当你在使用phpMyAdmin时,为了保护您的MySQL数据库,建议你采取一些措施使其安全可靠。其中之一是启用MySQL加密。这样可以确保你的数据库中的敏感信息在数据传输过程中不容易被截取到。以下是一些简单的步骤,可以帮助您将MySQL加密配置到phpMyAdmin中。 步骤 在MySQL服务器上为phpMyAdmin创建新用户 在MySQL服务器上为php…

    other 2023年6月27日
    00
  • 电脑文件名后缀不见了怎么回事?如何解决?

    电脑文件名后缀不见了可能是因为系统设置问题、病毒感染或人为操作等原因引起,一般可以通过以下方法进行解决。 方法一:调整系统显示设置 有时候可能是操作系统的默认设置让文件名后缀被隐藏了,可以通过调整系统显示设置来解决。 右键点击桌面空白处,选择“个性化”; 点击“更改桌面图标和视图”; 在“视图”标签下,找到“隐藏已知文件类型的扩展名”选项,将勾选去掉; 保存…

    other 2023年6月26日
    00
  • matlab里tic和toc

    Matlab里tic和toc 在使用 Matlab 进行程序设计中,我们需要测试程序的运行时间,这就需要用到 tic 和 toc 函数。以下将详细讲解这两个函数的用法与原理。 tic 的用法 tic 函数是 Matlab 中的一个内置函数,它的作用是设置计时器的起始时间,可以理解为是一个“打标记”的过程。使用 tic 函数很简单,只需要在程序开头调用即可。 …

    其他 2023年3月28日
    00
合作推广
合作推广
分享本页
返回顶部