**已关闭。**此问题需要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
结构中的数据?
1条答案
按热度按时间lokaqttq1#
1.您的函数没有返回值。
这在some_head.c中运行良好,但是当我尝试在其他地方使用create_phony()时
1.这是因为结构体的typedef也应该在**
.h
文件中,否则你只有前向声明,但是编译器不知道这个结构体的大小。您需要在
.h
**文件中包含其声明(原型),该文件必须包含在调用此函数的代码中。然后在**
.c
**文件中定义:注:
1.在
sizeof
中使用对象而不是类型。1.始终检查
malloc
系列函数的结果。