1

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

注意すべきもう1つの問題は、memcpy(dst, src, strlen(src))で、strlenがnull文字を終了せずに文字列の長さを返すことです。したがって、文字列全体をヌル文字とともにコピーする場合は、strlen関数によって返される値に1を追加する必要があります。

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

どちらもカーネルプログラミングには存在しないからです。

libc関数は、カーネルを言語標準に結び付けるという理由だけでカーネルで使用できません。また、一部の関数は、カーネルでの使用に非常に効率的です。Arvindは同等のカーネルを提供しています。

于 2012-08-26T04:53:21.830 に答える
0

カーネルCライブラリとlibcはどちらも異なります。カーネルモジュールでlibc関数を使用することは避けてください。そしてここでsprintfはlibcの下にあります。

于 2012-08-26T05:29:48.137 に答える
0

そこにある他のコーディングの問題とは別に、snprintf()とkmemdup()を使用してください。

于 2012-09-09T16:28:22.677 に答える