2012-08-26 45 views
0

爲什麼在以下代碼中的memcpysprintf在內核代碼中失敗?爲什麼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

那些你說它不在內核中。請嘗試grep內核並查看sprintf ....例如: http://lxr.free-electrons.com/source/drivers/s390/net/ctcm_sysfs.c?v=2.6.32 – 0x90

+0

請重新填寫您的問題標題。這個沒有意義 –

回答

2

的sprintf打印到一個字符數組。因此,正確的用法是,

char src [MAX_CHARS]; 
sprintf(src, "a = %d, b = %d", a, b); 

或者,你可以使用char *src和sprintf的調用之前分配內存以src

爲DEST聲明應該是,

char *src, *dest; 

另一個問題要注意的是,在memcpy(dst, src, strlen(src)),strlen的返回字符串的長度不終止空字符。因此,如果要將整個字符串與空字符一起復制,則必須將1加到由strlen函數返回的值。

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

sprintf是內核中沒有的libc函數 –

+0

@AdrianCornish,True,但它看起來像0x90正在學習分配,字符串,sprintf ... – shr

+0

@AdrianCornish'sprintf'在'lib/vsprintf.c'中定義。 – cnicutar

0

因爲在內核編程中都不存在。

libc函數不能用於內核,僅僅是因爲它們將內核綁定到語言標準 - 而且其中一些內核對於內核使用來說只是非常高效。 012vArvind提供了相應的內核。

+1

內核沒有與libc鏈接,但存在相同名稱的函數。 – cnicutar

+0

他們沒有被命名爲相同 –

+1

http://lxr.free-electrons.com/ident?i=snprintf http://lxr.free-electrons.com/ident?i=memcpy – cnicutar

1

你可以使用的kmalloc,kfree,ksnprintf -

+1

沒有稱爲'ksnprintf'的函數 – cnicutar

0

內核C庫和libc都是不同的。避免在內核模塊中使用libc函數。這裏sprintf在libc下。

0

除了其他編碼問題,您可以使用snprintf()和kmemdup()。

相關問題