在内核space中使用strsep分隔字符串
Using strsep in kernel space to separate a string
我正在尝试根据内核模块中的某个定界符分隔字符串。
我正在尝试使用 strsep()
函数,但是当我尝试使用它时我的内核崩溃了。
有人可以识别下面代码中的错误吗?
char *test = "test1:test2:test3";
char *token = test;
char *end = test;
while (token != NULL) {
strsep(&end, ":");
token = end;
}
kfree(test);
您正在传递一个字符串文字并且 strsep()
对其进行了修改,这是未定义的行为,请这样尝试
char test[] = "A:B:C:D";
你不应该 free(test)
,不是这个建议中的那个,也不应该是你代码中的那个。
你正在 free()
ing test
,这是最糟糕的,你应该在尝试编写 c 代码之前学习指针和动态内存,特别是如果它将是内核模块。
如果需要,编译器可能会警告您,但您应该通过声明任何指向字符串文字的指针来帮助编译器,例如 const
,例如在您的情况下 [=19] =]
const char *test = "Whatever";
然后编译器会说类似 strsep()
的第一个参数丢弃 const
限定符 ,这可能不会阻止它编译但会让你看你做错了什么。
我正在尝试根据内核模块中的某个定界符分隔字符串。
我正在尝试使用 strsep()
函数,但是当我尝试使用它时我的内核崩溃了。
有人可以识别下面代码中的错误吗?
char *test = "test1:test2:test3";
char *token = test;
char *end = test;
while (token != NULL) {
strsep(&end, ":");
token = end;
}
kfree(test);
您正在传递一个字符串文字并且 strsep()
对其进行了修改,这是未定义的行为,请这样尝试
char test[] = "A:B:C:D";
你不应该 free(test)
,不是这个建议中的那个,也不应该是你代码中的那个。
你正在 free()
ing test
,这是最糟糕的,你应该在尝试编写 c 代码之前学习指针和动态内存,特别是如果它将是内核模块。
如果需要,编译器可能会警告您,但您应该通过声明任何指向字符串文字的指针来帮助编译器,例如 const
,例如在您的情况下 [=19] =]
const char *test = "Whatever";
然后编译器会说类似 strsep()
的第一个参数丢弃 const
限定符 ,这可能不会阻止它编译但会让你看你做错了什么。