为什么内核代码中的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));
}
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 );
您可以使用 kmalloc、kfree、ksnprintf -
除了您遇到的其他编码问题外,请使用 snprintf() 和 kmemdup()。
因为在内核编程中都不存在。
libc 函数对内核不可用,仅仅是因为它们会将内核与语言标准联系起来——而且其中一些函数对于内核使用来说是非常有效的。Arvind 提供了内核等价物。
内核 C 库和 libc 都是不同的。避免在内核模块中使用 libc 函数。这里 sprintf 在 libc 下。