为什么memcpy和sprintf不能在这个内核代码中工作?

为什么memcpy和sprintf不能在这个内核代码中工作?,c,linux-kernel,kernel,C,Linux Kernel,Kernel,为什么下面代码中的memcpy和sprintf在内核代码中失败 static inline void my_func(){ char* src,dst; int a =9; int b=10; src = sprintf("a= %d b= %d",a,b); dst = kmalloc(strlen(src)*sizeof(char) , GFP_KERNEL); memcpy(dst, src, strlen(src)); } 因为两者都不存在于

为什么下面代码中的memcpy和sprintf在内核代码中失败

static inline void my_func(){
    char* src,dst;
    int a =9; int b=10;

    src = sprintf("a= %d b= %d",a,b); 
    dst = kmalloc(strlen(src)*sizeof(char) , GFP_KERNEL);
    memcpy(dst, src, strlen(src));
}

因为两者都不存在于内核编程中

libc函数不适用于内核,因为它们将内核绑定到一个语言标准,而且其中一些函数对于内核的使用非常有效。
Arvind提供了内核等价物。

,因为在内核编程中两者都不存在

libc函数不适用于内核,因为它们将内核绑定到一个语言标准,而且其中一些函数对于内核的使用非常有效。
Arvind提供了内核等价物。

您可以使用kmalloc、kfree、ksnprintf-

您可以使用kmalloc、kfree、ksnprintf-

将sprintf打印到字符数组中。因此正确的用法是

char src [MAX_CHARS];
sprintf(src, "a = %d, b = %d", a, b);
或者,您可以使用char*src并在调用sprintf之前将内存分配给src

dest的声明应该是

char *src, *dest;
另一个需要注意的问题是,在memcpydst、src、strlensrc中,strlen返回字符串的长度,但不包含终止的空字符。因此,如果要复制整个字符串和空字符,则必须在strlen函数返回的值中添加1

dest = malloc( strlen(src) + 1 );
memcpy( dest, src, strlen(src) + 1 );

sprintf打印到一个字符数组中。因此正确的用法是

char src [MAX_CHARS];
sprintf(src, "a = %d, b = %d", a, b);
或者,您可以使用char*src并在调用sprintf之前将内存分配给src

dest的声明应该是

char *src, *dest;
另一个需要注意的问题是,在memcpydst、src、strlensrc中,strlen返回字符串的长度,但不包含终止的空字符。因此,如果要复制整个字符串和空字符,则必须在strlen函数返回的值中添加1

dest = malloc( strlen(src) + 1 );
memcpy( dest, src, strlen(src) + 1 );

内核C库和libc都是不同的。避免在内核模块中使用libc函数。这里sprintf在libc下。

内核C库和libc都是不同的。避免在内核模块中使用libc函数。这里sprintf在libc下。

除了您在那里遇到的其他编码问题,请使用snprintf和kmemdup。

除了您在那里遇到的其他编码问题,请使用snprintf和kmemdup。

sprintf是libc中不可用的函数kernel@AdrianCornish,是的,但看起来0x90是学习分配,字符串,sprintf…@AdrianCornish sprintf是在lib/vsprintf.c.@shr中定义的,为什么这与他的问题有任何关联,即这些函数在内核中不可用-它们没有句号。@AdrianCornish lxr.free-electronics.com/source/lib/vsprintf.csprintf是内核中不可用的libc函数kernel@AdrianCornish符合事实的但看起来0x90是在学习分配,字符串,sprintf…@AdrianCornish sprintf是在lib/vsprintf.c.@shr中定义的,为什么这与他的问题有任何关联,即这些函数在内核中不可用-它们没有句号。@AdrianCornish lxr.free electrons.com/source/lib/vsprintf.c这里没有称为ksnprintf的函数这里没有称为ksnprintf的函数内核未与libc链接,但存在同名函数。内核没有与libc链接,但存在同名函数。你们中的一些人说它不在内核中。尝试grep内核并查看sprintf。。。。e、 g:请修改你的问题标题。这一个毫无意义,因为你说它不在内核中。尝试grep内核并查看sprintf。。。。e、 g:请修改你的问题标题。这一条毫无意义