Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C Linux内核:为什么对kstrtol的调用会崩溃?_C_Linux_Linux Kernel - Fatal编程技术网

C Linux内核:为什么对kstrtol的调用会崩溃?

C Linux内核:为什么对kstrtol的调用会崩溃?,c,linux,linux-kernel,C,Linux,Linux Kernel,我正在学习内核编程,并对kstrtol进行了一个简单的调用,我正在使用它将字符串转换为数字。然而,每次我编译这个模块并使用insmod将其放入内核时,我都会得到“BUG:无法在f862b026处理内核分页请求”,然后是一个寄存器和堆栈转储 我遵循这里的定义:。这似乎是一个非常简单的电话。我做错了什么 #include <linux/kernel.h> static int __init convert(void) { long myLong; char *myNum

我正在学习内核编程,并对kstrtol进行了一个简单的调用,我正在使用它将字符串转换为数字。然而,每次我编译这个模块并使用insmod将其放入内核时,我都会得到“BUG:无法在f862b026处理内核分页请求”,然后是一个寄存器和堆栈转储

我遵循这里的定义:。这似乎是一个非常简单的电话。我做错了什么

#include <linux/kernel.h>

static int __init convert(void)
{
    long myLong;
    char *myNumber = "342";
    myNumber[2] = '\0'; //Overwriting the '2', just so I know for sure I have a terminating '\0'

    if (kstrtol(myNumber, 10, &myLong) == 0)
    {
        printk("We have a number!\n");
    }
return 0;
}

static void __exit convert_exit(void)
{
    printk("Module unloaded\n");
}

module_init(convert);
module_exit(convert_exit); 
#包括
静态int\uu init转换(void)
{
龙迈龙;
char*myNumber=“342”;
myNumber[2]='\0';//覆盖'2',以便我确定我有一个终止'\0'
if(kstrtol(myNumber、10和myLong)==0)
{
printk(“我们有一个号码!\n”);
}
返回0;
}
静态无效\uuu退出转换\u退出(无效)
{
printk(“模块已卸载\n”);
}
模块_init(转换);
模块退出(转换退出);

您不能修改字符串文本。首先将其复制到数组中

编辑:改用这个

char mystr[] = "abdc";
编辑2: 其根本原因是,指向字符串文字的char指针指向数据段,通常为只读。如果你改变这个记忆,你可能会崩溃。
当您创建一个字符数组时,字符串文字会被复制到堆栈上的数组中,您可以在那里安全地修改它。

问题可能在于覆盖2。文本不应该被修改,问题是我需要对字符串使用字符指针,因为最终我需要解析进入模块的参数输入。我将一个字符串(格式如:120;某物)拆分为数字和单词。因此,我将数字存储在char*中。在这种情况下如何处理?
char*mystr[]=“abcde”;char*myptr=mystr
数组在几乎任何情况下都会衰减为指针,因此它应该是兼容的。@H2CO3,因为我使用参数,例如param=“1234;something”,并将其拆分为两个新字符串(分配内存后)strncpy(number,param,0,5)(类似于“something”部分)number[5]='\0';kstrtol(数字、10和结果)——其中结果是长的。这是一个糟糕的方法吗?如果是,正确的方法是什么approach@Maxthecat这是一个不错的方法。但是你正在处理一个数组。你不是吗?