argp_parse 段错误

问题描述 投票:0回答:1

我正在尝试开发一个模拟 6502 微处理器的项目,为此我希望获得一个可以使用多个命令行参数从命令行启动的 GUI。我使用 argp 标头来解析命令行参数,并使用 GTK 来解析 GUI。

这是我的 main.c 文件的片段:

#include <gtk/gtk.h>
#include <argp.h>
//Other includes I maybe forgot

//Exist in main.h but have been put here for clarity
void activate(GtkApplication* app, gpointer user_data);
error_t parse(int key, char *arg, struct argp_state *state);

error_t parse(int key, char* arg, struct argp_state* state) {
    // parse command line options and test their validity
}

void activate(GtkApplication* app, gpointer user_data) {
    // do stuff here idk
}

int main(int argc, char** argv) {
    struct argp_option options[4];
    //Initialize the options field (3 options + 1 zeroed struct)
    struct argp parser;
    parser->options = options;
    parser->parser = parse;
    //Segfaults during this function call
    argp_parse(&parser, argc, argv, 0, 0, NULL);

    //code would continue here...
}

当我按原样拥有此代码(当然包括编辑)时,它在对 argp_parse 的调用中出现段错误。如果我注释掉

activate
的定义(但是可以保留声明),它不会出现段错误,但这当然是一个不希望的结果。

我尝试将函数重命名为更不寻常的名称,例如

let_me_use_this_function_please
(我的假设是某些同名函数可能会以某种方式导致问题)并将 activate 函数提取到单独的源文件中也没有成功。这几乎是我尝试过的所有方法,因为我无法真正调试 argp 实现,因为我缺少源文件,所以我无法找出它的段错误到底在哪里。

c segmentation-fault gtk argp
1个回答
0
投票

经过一些实验,我意识到这是因为在为解析器分配内存的过程中,我忘记先将所有内容归零(我认为这也是我使用动态分配而不是堆栈分配的原因)。首先使用

memset
将选项数组和解析器结构设置为零,然后设置所有所需的数据,以防止崩溃发生。事实证明 GTK 回调完全无关,这只是我缺乏对 C 中内存分配如何工作的了解

© www.soinside.com 2019 - 2024. All rights reserved.