C语言 函数返回无效地址[已关闭]

nx7onnlm  于 2023-03-12  发布在  其他
关注(0)|答案(1)|浏览(103)

**已关闭。**此问题需要debugging details。当前不接受答案。

编辑问题以包含desired behavior, a specific problem or error, and the shortest code necessary to reproduce the problem。这将有助于其他人回答问题。
2天前关闭。
Improve this question
UPD:好的,很抱歉,但显然我提供的例子不足以重现我的错误,这就是为什么我会尝试给予更多的信息,我在做什么(我再次抱歉,我认为这是同样的问题,我有)。
我正在用c语言开发“库”,我想初始化这样的结构

// some_head.h
typedef struct phony phony;

phony* create_phony();
int action_on_phony(phony* target);
// some_head.c
#include "some_head.h"

typedef struct phony {
  GLFWwindow* window;
  int w, h;
} phony;

正如我所知,这种结构的实现对用户是隐藏的,用户无法访问其中的数据,但我的库函数仍然可以使用它(可以说是某种实现封装的方式)。这就是为什么我有一些创建函数(构造函数):

// some_head.c
phony* create_phony()
{
    phony* created = malloc(sizeof(phony));
    glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);
    created->w = 1920;
    created->h = 1080;
    created->window = glfwCreateWindow(1920/2, 1080/2, "Later", NULL, NULL);
    if (created->window)
      glfwMakeContextCurrent(created->window);
    return created;
}

int action_on_phony(phony* target)
{
      return !glfwWindowShouldClose(target->window); // <- raises BAD_ACCESS
}

这在some_head.c中运行良好,但是当我尝试在其他地方使用这个create_phony()时(例如main()):

#include "some_head.h"

int main()
{
    phony* obj = create_phony(); // <- gets invalid address
    action_on_phony(obj); 
    return 0;
}

它向我返回无效地址,我无法将其传递给some_head.c中的其他函数,因为它们在尝试使用此地址时获得无效地址并引发EXC_BAD_ACCESS
我假设这是由于phony struct的未知实现(毕竟只有some_head.c知道它的大小),main不知道这是什么,并做出了这种事情。所以我的问题是有没有一种方法可以正确地从some_head.c返回不完整的结构,或者找到另一种方法来封装phony结构中的数据?

lokaqttq

lokaqttq1#

1.您的函数没有返回值。
这在some_head.c中运行良好,但是当我尝试在其他地方使用create_phony()时
1.这是因为结构体的typedef也应该在**.h文件中,否则你只有前向声明,但是编译器不知道这个结构体的大小。
您需要在
.h**文件中包含其声明(原型),该文件必须包含在调用此函数的代码中。

phony *create_phony(void);

然后在**.c**文件中定义:

phony *create_phony(void)
{
    phony* obj = malloc(sizeof(*obj));
    if(obj)
    {  
        // init
    }
    return obj;
}

注:
1.在sizeof中使用对象而不是类型。
1.始终检查malloc系列函数的结果。

相关问题