我正在使用 ncurses.h 和 C 构建一个基于终端的文件查看器项目。 它只是一个业余爱好的业余项目,并且只有几行代码。 我遇到了一些分段错误,我什至不知道它们在哪里,如果有人可以检查 window.c,我将不胜感激。
void render_dir(WINDOW *win)
{
char **items_chars, *titulo, c;
int i=0, x, y;
int n;
DIR *dir;
ITEM **items;
MENU *menu;
char *path = get_current_dir();
path = strcat(path, "/");
dir = get_dir(path);
items_chars = dir_items(dir);
wclear(win);
titulo = malloc(MAX_LENGTH * sizeof(char));
strcpy(titulo, get_current_dir(path));
mvwprintw(win, 0, 1, titulo);
wrefresh(win);
n = n_elements(items_chars);
items = (ITEM **)calloc(n + 1, sizeof(ITEM *));
for (int j = 0; j < n; j++)
{
items[j] = new_item(items_chars[j], "");
}
// final have to be NULL
items[n] = (ITEM *)NULL;
menu = new_menu(items);
set_menu_win(menu, win);
set_menu_sub(menu, derwin(win, 25, 40, 2, 1));
// set_menu_fore(menu, A_NORMAL);
set_menu_format(menu, 25, 1);
set_menu_back(menu, COLOR_PAIR(1));
post_menu(menu);
wrefresh(win);
while ((c = wgetch(win)) != '1')
{
switch (c)
{
case 'j':
menu_driver(menu, REQ_DOWN_ITEM);
if (i > n)
i = n;
else
i++;
//i++;
wrefresh(win);
break;
case 'k':
menu_driver(menu, REQ_UP_ITEM);
if (i < 0)
i = 0;
else
i--;
//i--;
wrefresh(win);
break;
break;
case 'q':
delete_window(win);
exit(-1);
break;
case '\n':
for (int j = 0; j < n; j++)
{
free_item(items[j]);
}
free_menu(menu);
path = strcat(path, items_chars[i]);
free(items_chars);
free(titulo);
closedir(dir);
wclear(win);
delwin(win);
getmaxyx(stdscr, y, x);
if (x < WDIM_X || y < WDIM_Y)
win = init_window(WDIM_Y_MIN, WDIM_X_MIN, 5, 5);
else
win = init_window(WDIM_Y, WDIM_X, 5, 5);
cd(path);
free(path);
mvwprintw(win, 20, 1, "s");
render_dir(win);
break;
}
}
wrefresh(win);
}
我已尝试以各种方式释放所有内存,但它仍然存在分段错误和内存泄漏。