所以在main中我将menu_items数组的地址传递给函数initialize
int main(int argc, char * argv[])
{
struct vm vm;
struct menu_item menu_items[NUM_MENU_ITEMS];
initialize(&vm, argc, argv, &menu_items);
exit(EXIT_SUCCESS);
}
在函数初始化中,我调用menu_init(我已删除不必要的行)
BOOLEAN initialize(struct vm * vm, int argc, char * argv[], struct menu_item (* menu_items)[])
{
menu_init(menu_items);
}
这里有menu_init
void menu_init(struct menu_item (* menu_items)[NUM_MENU_ITEMS])
{
int i;
static struct menu_item menuTable[] = {
{ "Display Items", &displayItems },
{ "Purchase Items", &purchaseItems },
{ "Save and Exit", &saveExit },
{ "Add Item", &addItem },
{ "Remove Item", &removeItem },
{ "Display Coins", &displayCoins },
{ "Reset Stock", &resetStock },
{ "Reset Coins", &resetCoins },
{ "Abort Program", &abortProgram }
};
for (i = 0; i < NUM_MENU_ITEMS; i++) {
strcpy((*menu_items[i]).name, menuTable[i].name);
(*menu_items[i]).func = menuTable[i].func;
}
}
Struct menu_item看起来像这样
struct menu_item
{
char name[ITEM_NAME_LEN+1];
menu_ptr func;
};
奇怪的是,这可以在家用电脑上运行但在我的uni服务器上出现分段错误。有什么想法吗?
答案 0 :(得分:2)
请记住&#34;声明模仿使用&#34;,因此在初始化函数中,您将指针传递给菜单项结构数组:
struct menu_item (*menu_items)[]
你应该以同样的方式访问它们:
(*menu_items)[i].func = menuTable[i].func;
正如WhozCraig所指出的那样。 (在参数中声明维度实际上隐藏了一个有用的警告:(*menu_items[1])
指向整个项目块之后,这些项目位于未定义的区域内。)
但我认为你首先解决问题的方法太复杂了。你不需要传递指向数组的指针;传递数组就足够了:
void menu_init(struct menu_item menu_items[])
{
int i;
static struct menu_item menuTable[] = {
// ... snip ...
};
for (i = 0; i < NUM_MENU_ITEMS; i++) {
strcpy(menu_items[i].name, menuTable[i].name);
menu_items[i].func = menuTable[i].func;
}
}
void initialize(struct menu_item menu_items[])
{
menu_init(menu_items);
}
int main()
{
struct menu_item menu_items[NUM_MENU_ITEMS];
initialize(menu_items);
// .. snip ...
}
如果阵列基座本身可以改变,你只需要传递指针,但你不想要这样。
(也许这太复杂了。为什么不直接在文件范围内声明菜单项并直接处理它们?)
答案 1 :(得分:0)
首先,您需要显示结构的外观。
在第一眼看,我可以看到strcpy
是导致分段错误的那个。我看到你没有使用new / malloc为每个菜单项的strcuture内的指针分配任何内存。