【问题标题】:Crashes when reading a member pointer of a structure from a function从函数中读取结构的成员指针时崩溃
【发布时间】:2013-07-12 06:18:03
【问题描述】:

我有如下结构、类和函数sn-p:

结构:

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);
...

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

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 初始化的。

我为此修改了代码。

【问题讨论】:

  • 那甚至不应该编译! data 是一个指针,你使用. 来访问成员而不是-&gt;

标签: c++ pointers parameter-passing


【解决方案1】:

您没有在myData* data 行中为指针data 分配内存并尝试为其分配一些东西。替代方法是

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-27
      • 1970-01-01
      • 1970-01-01
      • 2023-03-27
      • 1970-01-01
      • 1970-01-01
      • 2012-03-13
      • 1970-01-01
      相关资源
      最近更新 更多