指针从C中的extern结构返回NULL

时间:2014-10-13 10:27:08

标签: c linux-kernel

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

  

file1.h

struct kobject_saved {
struct kobject* kobject;
}
extern struct kobject_saved *ksaved;
  

file1.c中

#include <file1.h>

struct kobject_saved *ksaved = kmalloc(sizeof(struct kobject_saved), GFP_KERNEL);
ksaved->kobject = some_kobject; // some_kobject is a initialized pointer to kobj
  

file2.c中

#include <file1.h>

struct kobject *ko = ksaved->kobject;

在这里,我得到kobject的值为null。即使在初始化发生在file1.c之后调用file2.c

您能否帮助我访问kobject而不会丢失数据?可能会指出我哪里出错了?

非常感谢,

更新:这是some_object的确切代码。我得到正确的地址&#34; ko&#34;虽然..

void save_my_kobject(struct kobject *ko)
{
        ko_saved = kmalloc(sizeof(struct kobject_saved), GFP_KERNEL);

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

}

1 个答案:

答案 0 :(得分:2)

缺少源代码的某些元素以清楚地了解您要执行的操作,例如:

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;