指向类型结构分段错误数组的指针

时间:2014-10-08 06:08:30

标签: c

所以在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服务器上出现分段错误。有什么想法吗?

2 个答案:

答案 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内的指针分配任何内存。