strdup linux,内存管理 – Linux内核API kstrdup

kstrdup函数功能描述:kstrdup( )函数的功能是为常量字符串s分配内存空间并将该字符串拷贝到所分配的地址空间中。

kstrdup文件包含

#include

kstrdup函数定义

在内核源码中的位置:linux-3.19.3/mm/util.c

函数定义格式:

char *kstrdup(const char *s, gfp_t gfp)

kstrdup输入参数说明

s:待分配内存空间的字符串。

gfp:分配模式,其取值及含义参考kmalloc( )函数的分析。

kstrdup返回参数说明

返回值指向为字符串所分配的内存空间的起始地址。

kstrdup实例解析

编写测试文件:kstrdup.c

头文件及全局变量声明如下:

#include

#include

#include

MODULE_LICENSE("GPL");

static int __init kstrdup_init(void);

static void __exit kstrdup_exit(void);

模块初始化函数:

int __init kstrdup_init(void)

{

char * temp;

const char *s = "hello world! "; //定义一个常量字符串

char * addr = kstrdup( s, GFP_KERNEL); //调用函数,分配模式为GFP_KERNEL

printk("addr = 0x%lx\n", (unsigned long)addr); //将字符串s拷贝到内存中的起始地址

printk("*addr = %c\n", *addr); //输出第一个字符

printk("*addr+4 = %c\n", *(addr+4)); //输出第五个字符

for(temp = addr; *temp ! ='\0'; temp ++) //循环地址中的字符值

printk("%c", *temp);

printk("\n");

return 0;

}

模块退出函数:

void __exit kstrdup_exit(void)

{

printk("exit ok! \n");

}

模块初始化及退出函数调用:

module_init(kstrdup_init);

module_exit(kstrdup_exit);

实例运行结果及分析:

首先编译模块,执行命令insmod kstrdup.ko插入模块,然后执行命令dmesg -c,会出现如图所示的结果。

bc3b8e81d184e72fdfb97b371ea45709.png

结果分析:

该测试程序中定义了一个常量字符串char * s = “hello world! ",将其作为参数传递给kstrdup( )函数,目的是为该字符串分配一个内存空间,并将其拷贝到该内存空间中。然后输出addr的值可看到所分配的内存空间的起始地址,再输出地址偏移为0和4处的内容,依次为’h’和’o',最后循环输出地址中的字符值,为“hello world! ”,可知原字符串已经被分配空间,并且成功完成拷贝。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值