0

我有一个相当复杂的代码,它在 AIX 上运行良好,但在 Solaris 中进行核心转储。我试图使其尽可能简化。

下面是一个具有指向函数的指针的全局结构

 custom_struct_1 my_struct1 = {
      intValue1, intValue2, intValue3, func3
   };

这是第二个结构,具有指向第一个的指针作为字段

  custom_struct_2 my_struct2 = {
      intValue1, intValue2, &my_struct1
  };

下面是流程

func1(){

   custom_struct *my_dumping_struct;
   memset(my_struct, 0, sizeof(my_struct);

   func2(my_dumping_struct, &my_struct2);


 }

func2(custom_struct *my_dumping_struct, custom_struct_2 *my_struct2 ){

   custom_struct1 *my_cust1;
   // Some conditions go here 

   my_cust1 = &my_struct2->custom_struct_1;

   my_cust1->struct_func(my_dumping_struct);

}


func3(custom_struct *my_dumping_struct)
{
    // Here when trying to access any field of the passed structure
    // a core dump is occuring
    if(my_dumping_struct->intValue1 == 0)
    {
        ....
    }
}

我很感激任何帮助。这让我快疯了。我尝试了很多东西,比如首先定义没有指针的转储结构,使用

  memset(&my_dumping_structre, 0, sizeof(my_dumping_struct))

并通过对它仍然核心转储的其他函数的引用传递它。

编辑

结构定义如下:

 struct custom_struct {
            int intValue1;
            int intValue2;
         };

         struct custom_struct_1 {

            int intValue1;
            int intValue2;
            int intValue3;
            int (*struct_func)(custom_struct *my_struct);
         };

         struct custom_struct_2 {
            int intValue1;
            int intValue2;
            struct custom_struct_1 *my_struct;
         };

谢谢

4

2 回答 2

0

表达式&my_struct2->custom_struct_1没有做你期望它做的事情。它返回指针的地址,也就是指向结构指针的指针custom_struct_1

不要使用地址运算符&,它应该工作更好。

您在更多地方遇到此问题,实际上几乎在您使用指针的任何地方都使用指针的地址。

你可能还有另一个问题,除非你没有向我们展示完整的代码func1,那就是你没有my_dumping_struct在使用它之前初始化指针。这意味着它将指向一个看似随机的地址,并且对该指针的所有取消引用都将是未定义的行为,并且很可能会崩溃。

实际上,你应该有很多关于所有这些的编译器警告。

于 2013-04-30T19:51:46.973 回答
0

malloc 似乎解决了这个问题

custom_struct *my_dumping_struct  = malloc(sizeof *my_dumping_struct);

抱歉,如果不是很清楚,谢谢大家的建议和帮助

于 2013-05-04T17:07:19.503 回答