【问题标题】:Pointer returning NULL from extern structure in C从 C 中的外部结构返回 NULL 的指针
【发布时间】:2014-10-13 10:27:08
【问题描述】:

我在 .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 的值设为空。即使对 file2.c 的调用是在 file1.c 初始化之后进行的

你能帮我在不丢失数据的情况下访问 kobject 吗?可能指出我哪里出错了?

非常感谢,

更新:这是我对 some_object 的确切代码。我得到了正确的“ko”地址..

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

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

}

【问题讨论】:

  • 取出文件1.h中的extern,在文件2.h中声明extern struct *ksaved。 extern 是为了让编译器知道,即使一个变量可能没有在那个文件中声明,它在另一个文件的某个地方,所以它可以被访问。

标签: c linux-kernel


【解决方案1】:

缺少源代码的某些元素以清楚地了解您想要做什么,例如:

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;

【讨论】:

  • 感谢您的 cmets。但我现在想基本上写我在我的问题中更新的 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 不要在 cmets 中发布代码,编辑您的问题并在那里添加相关信息。
  • 作为更新后的一般评论:您将全局变量与局部变量交错到您的函数代码中,即使对于简单的事情,也很难遵循和调试。我想邀请您尝试不使用全局变量,并以不同的方式思考您的程序以摆脱它们。它将让您将注意力集中在一个更好的方向上,直接结果是更安全的 C 代码生成。
猜你喜欢
  • 1970-01-01
  • 2021-12-31
  • 2017-06-13
  • 2014-09-09
  • 2017-08-22
  • 1970-01-01
  • 1970-01-01
  • 2022-06-15
  • 1970-01-01
相关资源
最近更新 更多