【问题标题】:C ncurses: Create WINDOW in another functionC ncurses:在另一个函数中创建窗口
【发布时间】:2020-12-13 04:23:25
【问题描述】:

我是 ncurses 的新手,对 C 语言非常生疏,所以我认为对此有一个简单的解释。我希望将窗口作为结构的属性并将其传递给其他函数。但是每次我在函数外使用 WINDOW 时,都会出现分段错误。

test1 是我的理想,但我会尽一切努力。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <libgen.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <ncurses.h>

struct Program {
    WINDOW *window;
};

struct Program *Program_create() {  
    struct Program p, *program = &p;
    program->window = newwin(10, 10, 0, 0);
    return program;
}

void sanity();
void test1();
void test2();
void test3();

int main(/* int argc, char *argv[]*/) {
    initscr();
    noecho();

    //sanity(); // creates box no problem
    //test1(); // Segmentation fault (core dumped)
    //test2(); // Segmentation fault (core dumped)
    //test3(); // creates box no problem

    endwin();
    return EXIT_SUCCESS/* 0 */;
}

void sanity() {
    WINDOW *window = newwin(10, 10, 0, 0);
    box(window, 0, 0);
    wrefresh(window);
    wgetch(window);
}

void test1() {
    struct Program *program = Program_create();
    box(program->window, 0, 0);
    wrefresh(program->window);
    wgetch(program->window);
}

void test2() {
    struct Program p, *program = &p;
    program = Program_create();
    box(program->window, 0, 0);
    wrefresh(program->window);
    wgetch(program->window);
}

void test3() {
    struct Program p, *program = &p;
    program->window = newwin(10, 10, 0, 0);
    box(program->window, 0, 0);
    wrefresh(program->window);
    wgetch(program->window);
}

【问题讨论】:

    标签: c pointers segmentation-fault ncurses


    【解决方案1】:
    struct Program *Program_create() {  
        struct Program p, *program = &p;
        program->window = newwin(10, 10, 0, 0);
        return program;
    }
    

    分段错误的原因:这里的结构实例p是一个局部变量。在我们从函数返回后,这个结构实例 (p) 被删除。而指针program 指向一些无效数据。 program 变成了一个悬空指针。

    解决方案:在堆中分配内存,使用malloc

    struct Program *Program_create() {  
            struct Program *program = malloc(sizeof(struct Program));
            program->window = newwin(10, 10, 0, 0);
            return program;
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-09
      • 2016-05-08
      • 1970-01-01
      相关资源
      最近更新 更多