Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.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中从外部结构返回NULL的指针_C_Linux Kernel - Fatal编程技术网

C中从外部结构返回NULL的指针

C中从外部结构返回NULL的指针,c,linux-kernel,C,Linux Kernel,我在.h文件中定义了以下全局结构: 文件1.h 文件1.c 源代码的某些元素缺失,无法清楚地理解您想要做什么,例如: struct *ko = ksaved->kobject; 不可能是对的。 我猜你的意思是: struct kobject* ko = ksaved->kobject; 您基本上是在设置一个全局变量,该变量将由两个源文件修改。这不是推荐的做法(难以维持) 无论如何,如果这是您想要做的,您必须在一个文件中定义全局变量,并从第二个文件引用它,就像您所做的那样。exte

我在.h文件中定义了以下全局结构:

文件1.h

文件1.c


源代码的某些元素缺失,无法清楚地理解您想要做什么,例如:

struct *ko = ksaved->kobject;
不可能是对的。 我猜你的意思是:

struct kobject* ko = ksaved->kobject;
您基本上是在设置一个全局变量,该变量将由两个源文件修改。这不是推荐的做法(难以维持)

无论如何,如果这是您想要做的,您必须在一个文件中定义全局变量,并从第二个文件引用它,就像您所做的那样。
extern
语句最好保持在
file2.c
中本地化

我们没有您的确切序列,因此我们不知道您的代码的行为。显然它没有崩溃,所以我猜
file1.c
中的malloc工作正常。这意味着
file1.c
已按预期运行。这也意味着问题可能在于这句话:

ksaved->kobject = some_kobject; // some_kobject is a initialized pointer to kobj

可能是错误的:可能
some_kobject==NULL

取出文件1.h中的extern并在文件2.h中声明extern struct*ksaved。extern是让编译器知道,即使某个变量可能没有在该文件中声明,它也在另一个文件中的某个位置,因此可以访问它。谢谢您的评论。但我想基本上编写struct kobject*,现在我在问题中更新了它。但是告诉我指针为什么为空的任何帮助都是有用的。
void save_my_kobject(struct kobject*ko){ko_saved=kmalloc(sizeof(struct kobject_saved),GFP_KERNEL);*ko_saved=(struct kobject_saved){.kobj=ko}
这是我的确切代码。@paivas不在注释中发布代码,编辑您的问题并在此处添加相关信息。作为更新后的一般评论:您正在将全局变量与局部变量交叉插入函数代码中,这使得跟踪和调试相当困难,即使对于简单的事情也是如此。我想请您尝试不使用全局变量,并以不同的方式思考您的程序以消除它们。它将允许您将精力集中在更好的方向上,直接导致更安全的C代码生成。
void save_my_kobject(struct kobject *ko)
{
        ko_saved = kmalloc(sizeof(struct kobject_saved), GFP_KERNEL);

        *ko_saved = (struct kobject_saved) {
        .kobj = ko
        };

}
struct *ko = ksaved->kobject;
struct kobject* ko = ksaved->kobject;
ksaved->kobject = some_kobject; // some_kobject is a initialized pointer to kobj