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

时间:2012-08-26 04:52:38

标签: c linux-kernel kernel

为什么以下代码中的memcpysprintf在内核代码中失败?

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));
}

5 个答案:

答案 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()。