1

2 つの異なる方法で構造体へのポインターを取得する次のコード例があります。最初のもの ("Test1") は成功しますが、2 番目のものは文字列 ( title ) を出力しようとするとセグメンテーション違反で失敗しますが、数値 ( type ) は正しく出力されます。

#include <stdio.h>
#include <stdlib.h>

typedef struct{
    unsigned char type;
    char* title;
} MenuItem;

typedef struct{
    unsigned short itemCount;
    MenuItem *items;    
} Menu;

Menu* createMenu(unsigned short itemCount, MenuItem items[]){
    Menu *menu = malloc(sizeof(Menu));
    menu->itemCount = itemCount;
    menu->items = items;
    return menu;
}

Menu* getSampleMenu(void){
    return createMenu(2,(MenuItem[]){
        {3,"Foo2"},
        {4,"Bar2"}
    });
}

void showMenu(const Menu *menu){
    for(unsigned short i = 0; i < menu->itemCount; i++)
        printf("Item %d: %d/%s\n",i,menu->items[i].type,menu->items[i].title);
}

int main(void){
    //Test 1
    Menu *menu = createMenu(2,(MenuItem[]){
        {1,"Foo"},
        {2,"Bar"}
    });
    showMenu(menu);
    //Result: 1/Foo\n 2/Bar

    //Test 2
    showMenu(getSampleMenu());
    //Result: 3/ [segmentation fault]
}

何が問題なのか分かりますか?この例は、C99 モードで gcc 4.6.3 を使用して Debian でコンパイルおよびテストされています。

前もって感謝します!

4

3 に答える 3

0

「MenuItem[]」はこの関数でローカルに定義されているため、関数が戻ると、ポインターmenu->itemsは無効になります。getSampleMenu()

したがって、テスト 2 では、プログラムにアクセスすると segfault が発生menu->itemsshowMenu()ます。

于 2013-04-19T15:32:32.220 に答える