我目前正在编写一个小型应用程序来重新熟悉 C(自从我上次编写任何程序以来已经有一段时间了),并且像大多数人一样,我遇到了一个我无法弄清楚的内存分配问题。
代码围绕不同面板、窗口和相关标题的设置展开。正是我遇到问题的标题字符串的内存分配。
基础是一个结构,其中包含:
struct TFB_PANEL
{
WINDOW *window;
char *title;
};
这是在头文件中的 typedef 为:
typedef struct TFB_PANEL TfbPanel;
在相关的 C 文件中,我有以下方法初始化TFB
一个固定大小的数组。
int tfb_init()
{
if (!_initialised) {
return -1;
}
int i;
for (i = 0; i < TYPE_MAX; i++) {
TFB[i] = malloc(sizeof(TfbPanel*));
TFB[i]->title = calloc((strlen(TYPES[i]) + 18), sizeof(char*));
switch(i)
{
case A:
sprintf(TFB[i]->title, " %s | r | h | s | t ", TYPES[i]);
break;
case B:
sprintf(TFB[i]->title, " f | %s | h | s | t ", TYPES[i]);
break;
case C:
sprintf(TFB[i]->title, " f | r | %s | s | t ", TYPES[i]);
break;
case D:
sprintf(TFB[i]->title, " f | r | h | %s | t ", TYPES[i]);
break;
case E:
sprintf(TFB[i]->title, " f | r | h | s | %s ", TYPES[i]);
break;
}
TFB[i]->window = tfb_create_window(i);
}
return 0;
}
现在在初始化 C 时会发生错误。A 和 B 正确设置为 25 个字符的长度。另一方面,C 在初始化后应该包含 24 个字符,但是(从 tfb_create_window 中)我收到
Program received signal EXC_BAD_ACCESS, Could not access memory
Reason: 13 at address 0x0000000000000000
0x00007fff930b9390 in strcmp()
检查堆栈显示 TFB[C] 已正确初始化,但标题元素未正确初始化。这包含一个空元素,就好像我从未调用过 calloc 一样。
请有人可以解释我哪里出了问题,或者为什么 A 和 B 被正确初始化但 C 杀死了应用程序。直到今天早上 6 点左右,一切都很顺利,从那以后就一直在下山。
如果有帮助,tfb_create_window
则通过调用_create_window
和调用tfb_get_title
定义如下:
char *tfb_get_title(int type)
{
if (type >= TFB_MAX) {
return (char*)NULL;
}
return TFB[type]->title;
}
WINDOW *tfb_create_window(int type)
{
int height = ((LINES - WIN_OFFSET_Y) / 3);
char *title = tfb_get_title(type);
return _create_window(height, WIN_SIDEBAR_X, WIN_OFFSET_Y, 0, COLOUR_MAIN, title);
}
WINDOW *_create_window(int height, int width, int starty, int startx, int color, const char *title)
{
WINDOW *window;
window = newwin(height, width, starty, startx);
box(window, 0, 0);
mvwprintw(window, 0, 2, title);
wbkgd(window, COLOR_PAIR(color));
return window;
}