从函数读取结构的成员指针时崩溃

时间:2013-07-12 06:18:03

标签: c++ pointers parameter-passing

我有以下结构,类和函数代码段:

结构:

struct myData
{
  short index;
  char  name[32];
}

类:

class myFoo
{
...
public:
   short    count;
   myData** data;
...
}

功能:

int Do_Bar(myFoo vFoo)
{
  ...
  myData* data = *vFoo.data;
  for (short i=0; i<vFoo.count; ++i)
  {
    Printf("%3d %s", data.index, data.name);
  }
  ...
}

函数调用:

...
myFoo foo;
SomeAPI_GetCompleteObjectList(&foo);
Do_Bar(foo);
...

但我的代码与这些代码崩溃了。但是,如果我删除了参数并在myFoo函数中创建了Do_Bar()类,则代码可以正常工作:

int Do_Bar(myFoo vFoo)
{
  myFoo foo;
  SomeAPI_GetCompleteObjectList(&foo);
  ...
  myData* data = *vFoo.data;
  for (short i=0; i<vFoo.count; ++i)
  {
    Printf("%3d %s", data.index, data.name);
  }
  ...
}

为什么?以及如何解决这个问题?

EDIT1:

我忘了提到foo的初始化是在函数调用之前完成的。这是使用API​​初始化的。

我为此修改了代码。

2 个答案:

答案 0 :(得分:0)

你没有给行data中的指针myData* data留下内存,并试图给它指定一些东西。替代方法是

定义myData data,然后使用&data作为指针

或使用动态内存分配来分配内存。

答案 1 :(得分:0)

在那段小代码中你有几个未定义的行为 ......

  • 你有一个双指针,但从来没有“指出”它们中的任何一个。这意味着它们将指向随机存储位置。
  • 您打印未初始化的字符数组,这意味着它包含随机数据。
  • 由于您根本不进行任何初始化,foo.count也会包含一个随机值,可能是负值或非常大。

最后一个机器人,就像我在评论中所说的那样,代码甚至不应该编译,因为你使用错误的语法来访问结构中的成员。