我有以下代码示例,它以两种不同的方式获取指向结构的指针.当第一个("Test1")成功时,第二个在尝试输出字符串(标题)时失败并出现Segmentation故障,而数字(类型)打印正确:
#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]
}
Run Code Online (Sandbox Code Playgroud)
你知道问题可能是什么吗?该示例使用gcc 4.6.3在C99模式下在Debian上编译和测试.
提前致谢!
您传递的数组createMenu具有"自动存储持续时间".一旦getSampleMenu结束,它就会死掉,任何指向它的指针都会变得无效.
(编辑:它可能实际上甚至比那更严重.作为临时对象的数组,一旦导致其创建的语句结束,可能会死亡.在这种情况下,两者大致相同,因为该语句是最后一个在函数中...但是后来有没有createSampleMenu尝试使用该菜单的语句,即使它们可能跟随无效指针.)
您需要动态分配(malloc)一些内存并将数组复制到其中.(当然,destroyMenu一旦菜单不再需要,你也应该有一个或类似的功能来正确释放内存.)
| 归档时间: |
|
| 查看次数: |
113 次 |
| 最近记录: |