2014-10-08 51 views
-1

我通過menu_items數組的地址到功能初始化指向類型STRUCT分割錯誤的陣列,使得在主

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; 
    } 
} 

結構MENU_ITEM看起來是這樣的

struct menu_item 
{ 
    char name[ITEM_NAME_LEN+1]; 
    menu_ptr func; 
}; 

奇怪的是這個工作對我的家用電腦,但得到我的UNI的服務器上分割故障。有任何想法嗎?

+2

'(* menu_items [1])'===>'(* menu_items )[I]'。除非'menuTable'與'NUM_MENU_ITEMS'大小相同*或*大於'',否則您將從未定義的內存空間讀取數據,並使用該循環調用未定義的行爲。 – WhozCraig 2014-10-08 06:19:40

+0

可以請你粘貼整個程序,因爲它是。它有助於分析程序。 – Ajay 2014-10-08 06:19:54

回答

0

首先,您需要展示結構的外觀。 在第一次看,我可以看到strcpy是導致分段錯誤的那個。我發現你沒有使用new/malloc將任何內存分配給每個菜單項的strcuture內的指針。

+0

主題已更新。 – Teddy 2014-10-08 06:20:58

2

請記住,「宣言模擬了使用」,所以在你的初始化函數,在那裏你將指針傳遞給菜單項結構數組:

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 ... 
} 

你只需要通過指針,如果數組基地本身也有變化,但你不希望出現這種情況。

(甚至是太複雜了。爲什麼不直接申報文件的範圍和工作的菜單項上他們嗎?)