Linux教程

Linux c函数库-内存相关函数

本文主要是介绍Linux c函数库-内存相关函数,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

以下的知识来源于网络,如有侵权,请联系我删除哈

内容介绍:
1、malloc函数
2、calloc函数
3、realloc函数
4、free函数
5、bzero函数
6、memset函数
7、memcpy函数
8、memcmp函数
9、sprintf函数

内容详细介绍:

1、malloc函数

malloc函数功能:去堆区申请size个字节
相关函数calloc, free, realloc, brk
头文件#include<stdlib.h>
函数定义void * malloc (size_t size)
函数说明malloc() 用来申请一段内存空间,大小为size个字节
返回值申请成功,返回申请到的内存空间的起始地址;申请失败,返回NULL

代码演示:

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

int main(int argc, char const *argv[])
{
    
    char *p = malloc(4);  //申请4个字节

    memset(p, 'a',4);     

    for (size_t i = 0; i < 4; i++)
    {
       printf("%d\n", *(p+i));
    }

    return 0;
}

执行结果:
在这里插入图片描述

2、calloc函数

calloc函数功能:去堆区申请 (nmemb*size) 个字节
相关函数malloc, free, realloc, brk
头文件#include<stdlib.h>
函数定义void calloc (size_t nmemb, size_t size)
函数说明calloc() 用来配置nmemb个相邻的内存单元,每个单元的大小为size,并且返回指向这块内存的起始地址。这和使用malloc(nmemb*size)的效果相同,只不过使用calloc()申请的内存已经初始化为0了
返回值申请成功返回内存的起始地址,申请失败返回NULL

代码演示:

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

int main(int argc, char const *argv[])
{
    //等价于malloc(4);
    char *p = calloc(1, 4);  //申请4个字节

    for (size_t i = 0; i < 4; i++)
    {
       printf("%d\n", *(p+i));
    }
    printf("------------------------------\n");
    memset(p, 'a',4);     //先给申请的空间赋值

    for (size_t i = 0; i < 4; i++)
    {
       printf("%d\n", *(p+i));
    }

    return 0;
}

执行结果:
在这里插入图片描述

3、realloc函数

realloc函数功能:重新申请size个字节大小的堆内存
相关函数malloc, free, calloc, realloc
头文件#include<stdlib.h>
函数定义void * realloc (void *ptr, size_t size)
函数说明realloc() 把ptr所指向的内存块大小拓展到size个字节,如果size的大小大于原来内存块的大小,原来内存块的内容保持不变,增加的内存不会被初始化;如果ptr == NULL且size != 0,就等价于调用malloc(size); 如果size = 0且ptr != NULL,就等价于调用free(ptr) ; (注意:如果增加的内存空间比较小,系统可能会在原来内存块的后面拓展;如果增加的内存空间比较大,系统就会另外开辟内存来存储了,同时参数ptr在内部会被释放掉,所以在外部不需要重复释放)
返回值

代码演示:
第1种情况:直接在原来内存块的后面拓展

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



int main(int argc, char const *argv[])
{
 
    char *p = calloc(1, 4);
    
    memset(p,'a',4);

    for (size_t i = 0; i < 4; i++)
    {
        printf("p[%ld]: %c\n", i, p[i]);
    }
    printf("char *p: %p\n", p);
    printf("------------------------\n");
    
    char * p2 = realloc(p, 10); //重新申请大小

    for (size_t i = 0; i < 10; i++)
    {
        printf("p2[%ld]:%c ", i, p2[i]);
    }
    printf("\n--------------------\n");
    printf("char *p2: %p\n", p2);
    printf("--------------------\n");
    
    return 0;
}

执行结果:
在这里插入图片描述

第2种情况:

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



int main(int argc, char const *argv[])
{
 
    char *p = calloc(1, 4);
    
    memset(p,'a',4);

    for (size_t i = 0; i < 4; i++)
    {
        printf("p[%ld]: %c\n", i, p[i]);
    }
    printf("char *p: %p\n", p);
    printf("------------------------\n");
    
    char * p2 = realloc(p, 50); //重新申请大小

    for (size_t i = 0; i < 50; i++)
    {
        printf("p2[%ld]:%c ", i, p2[i]);
    }
    printf("\n--------------------\n");
    printf("char *p2: %p\n", p2);
    printf("--------------------\n");
    
    return 0;
}

在这里插入图片描述

4、free函数

free函数功能:释放原先申请内存空间
相关函数malloc, calloc, realloc,brk
头文件#include<stdlib.h>
函数定义void free (void * ptr)
函数说明参数ptr为指向先前由malloc, calloc, realloc所返回的的内存指针,调用free()后ptr所指向的内存空间便会被收回,假若参数ptr所指向的内存空间已经被收回或者是位置内存地址,则调用free()可能会出现无法预期的情况发生;如参数ptr为NULL,则free()不会有任何的效果哈(注意:指向某块内存的指针ptr,被调用free()释放掉后,需要把ptr设置为NULL, 如果重复释放,可能会出现无法预期的情况发生)
返回值

代码演示:

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


int main(int argc, char const *argv[])
{
 
    char *p = calloc(1,4);

    memset(p, 'a', 4);

    for (size_t i = 0; i < 4; i++)
    {
        printf("p[%ld]:%c\n", i, p[i]);
    }

    printf("----------------\n");
    free(p);

     //释放后再访问已经是非法访问了,这里仅仅是演示,释放后的内存空间的变化
     //c语言的机制对释放的空间并不会清零,我这输出0,是系统的原因,正常情况下是不做任何处理的哈
    for (size_t i = 0; i < 4; i++)     
    {
        printf("p[%ld]:%c\n", i, p[i]);
    }
    
    return 0;
}

执行结果:
在这里插入图片描述

5、bzero函数

bzero函数功能:把一段内存内容全清为0
相关函数memset, swab
头文件#include<string.h>
函数定义void bzero (void *, int n)
函数说明bzero() 会将参数s所指向的内存区域前n个字节,全部设置为0,相当于调用memset ((void *)s, 0, size_t n) ,建议使用menset来代替
返回值

代码演示:

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

int main(int argc, char const *argv[])
{
    
    char *p = malloc(4);  //申请4个字节

    memset(p, 'a',4);     //先给申请的空间赋值,然后再调用bzero函数来清空内存

    for (size_t i = 0; i < 4; i++)
    {
       printf("%d ", *(p+i));
    }
    printf("\n-------------------------\n");

    bzero(p, 4);

    for (size_t i = 0; i < 4; i++)
    {
       printf("%d", *(p+i));
    }

    return 0;
}

执行结果:
在这里插入图片描述

6、memset函数

memset函数功能:将一段内存填充为c值
相关函数bzero, swab
头文件#include<string.h>
函数定义void * memset (void *s , int c, size_t n)
函数说明memset() 会将参数s所指向的内存区域前n个字节以参数填入,然后返回指向s的指针,在编写程序时,若需要初始化某一数组,调用memset()会相当方便哈(注意:参数c虽然声明为int类型,但是必须为unsigned char 哈,所以范围在0-255之间哈)
返回值返回指向s的指针

代码演示:

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


int main(int argc, char const *argv[])
{
 
    char *p = calloc(1,4);

    memset(p, 'A', 4);

    for (size_t i = 0; i < 4; i++)
    {
        printf("p[%ld]:%c\n", i, p[i]);
    }
    
    return 0;
}

执行结果:
在这里插入图片描述

7、memcpy函数

memcpy函数功能:内存拷贝
相关函数bcopy, memcpy, memccpy, memmove, strcpy, strncpy
头文件#include<string.h>
函数定义void * memcpy (void * dest, const void *src, size_t n)
函数说明memcpy() 用来拷贝src所指向的内存空间的前n个字节到dest所指向的内存地址上。与strcpy() 不同的是,memcpy() 会完整地复制n个字节,不会因为遇到字符串结束符’\n’而结束哈 (注意:指针src和dest所指向的内存区域不可重叠overlap)
返回值返回指向dest的指针

代码演示:

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

int main(int argc, char const *argv[])
{
    char a[30] = "string (a)";
    char b[30] = "string\0string";

    strcpy(a, b);
    for (size_t i = 0; i < 30; i++)
    {
        printf("%c\n", a[i]);
    }
    printf("\n--------------------\n");
    
    memcpy(a, b, 30);
    for (size_t i = 0; i < 30; i++)
    {
        printf("%c\n", a[i]);
    }
    return 0;
}

执行结果:
在这里插入图片描述
在这里插入图片描述

8、memcmp函数

memcmp函数功能:内存内容比较
相关函数bcmp, strcasecmp, strcmp. strcoll, strncmp, strncasecmp
头文件#include<string.h>
函数定义int memcmp (const void *s1, const void *s2)
函数说明memcmp() 用来比较s1和s2所指向的内存区间前n个字符,字符串大小的比较是以ASCII码表上的顺序来决定,次顺序亦为字符的值;memcmp() 首先将S1de 第一个字符减去s2的第一个字符的值,若差值为0,则继续比较下一个字符,如果差值不为0,则将差值返回。例如,字符串“Ac" 和"ba"比较 则返回字符’A‘(65)和’b‘(98)的差值(-33)
返回值若参数s1和s2所指向的内存内容都完全一样则返回0;若s1 > s2,返回大于0 的值;若s1 < s2,返回小于0 的值

代码演示:

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

int main(int argc, char const *argv[])
{
    
    char *p1 = "asfd";
    char *p2 = "asfd";
    char *p3 = "zsd";

    printf("%d\n", memcmp(p1, p2, 3));
    printf("%d\n", memcmp(p1, p3, 3));
    
    return 0;
}

执行结果:
在这里插入图片描述

9、sprintf函数

sprintf函数功能:格式化字符串拷贝
相关函数printf, sprintf
头文件#include<stdio.h>
函数定义int sprintf (char *str, const char *format, …)
函数说明sprintf() 会根据参数format字符串来转换并格式化数据,然后将结果复制到参数str所指向的字符串数组,直到出现字符串结束(’\n‘)为止,关于参数format字符串的格式请参考printf()(注意:使用此函数得留意堆栈溢出,或者改用snprintf() 函数)
返回值成功则返回参数str字符串的长度,失败则返回-1,错误的原因存放于errno中

代码演示:

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

int main(int argc, char const *argv[])
{
    
    char dest[50];
    bzero(dest, 50);
   
    sprintf(dest,"%s","我是马保国");

    printf("%s\n", dest);

    return 0;
}

执行结果:
在这里插入图片描述

这篇关于Linux c函数库-内存相关函数的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!