为什么以下代码中的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));
}
答案 0 :(得分:2)
sprintf打印到char数组。因此,正确的用法是,
char src [MAX_CHARS];
sprintf(src, "a = %d, b = %d", a, b);
或者,您可以在调用sprintf之前使用char *src
并将内存分配给src
。
dest的声明应该是,
char *src, *dest;
要注意的另一个问题是,在memcpy(dst, src, strlen(src))
中,strlen返回字符串的长度而没有终止空字符。因此,如果要将整个字符串与空字符一起复制,则必须将strlen
函数返回的值加1。
dest = malloc( strlen(src) + 1 );
memcpy( dest, src, strlen(src) + 1 );
答案 1 :(得分:1)
你可以使用kmalloc,kfree,ksnprintf -
答案 2 :(得分:0)
因为内核编程中都不存在。
内核无法使用libc函数,因为它们将内核与语言标准联系起来 - 而且其中一些函数对于内核使用来说非常有效。 Arvind提供了内核等价物。
答案 3 :(得分:0)
内核C库和libc都不同。避免在内核模块中使用libc函数。这里sprintf在libc下。
答案 4 :(得分:0)
除了你遇到的其他编码问题,请使用snprintf()和kmemdup()。