2012-08-26 2 views
0

Почему код memcpy и sprintf в следующем коде не имеют кода ядра?Почему в этом коде ядра не работают 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 и выделить память для src до вызова Sprintf.

Заявление для 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 недоступны ядру просто потому, что они затем привязывают ядро ​​к стандарту языка, а некоторые из них просто эффективны для использования ядра. Arvind предоставил эквиваленты ядра.

+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 оба являются dofferent. Избегайте использования функции libc в модулях ядра. И здесь sprintf находится под libc.

0

Помимо других проблем с кодированием, которые у вас есть, используйте snprintf() и kmemdup().

Смежные вопросы