1

为什么内核代码中的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));
}
4

5 回答 5

3

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 返回不带终止空字符的字符串长度。因此,如果要复制整个字符串以及空字符,则必须将函数返回的值加 1 strlen

dest = malloc( strlen(src) + 1 );
memcpy( dest, src, strlen(src) + 1 );
于 2012-08-26T05:17:38.807 回答
1

您可以使用 kmalloc、kfree、ksnprintf -

于 2012-08-26T04:57:26.597 回答
0

除了您遇到的其他编码问题外,请使用 snprintf() 和 kmemdup()。

于 2012-09-09T16:28:22.677 回答
0

因为在内核编程中都不存在。

libc 函数对内核不可用,仅仅是因为它们会将内核与语言标准联系起来——而且其中一些函数对于内核使用来说是非常有效的。Arvind 提供了内核等价物。

于 2012-08-26T04:53:21.830 回答
0

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

于 2012-08-26T05:29:48.137 回答