C 尝试访问传递给solaris中函数的结构指针时的核心转储

C 尝试访问传递给solaris中函数的结构指针时的核心转储,c,structure,solaris,coredump,C,Structure,Solaris,Coredump,我有一个相当复杂的代码,它在AIX上运行良好,但在Solaris中内核转储。我尽量把它简化 下面是一个全局结构,它有一个指向函数的指针 custom_struct_1 my_struct1 = { intValue1, intValue2, intValue3, func3 }; 这是第二个结构,具有指向第一个结构的指针作为字段 custom_struct_2 my_struct2 = { intValue1, intValue2, &my_stru

我有一个相当复杂的代码,它在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;
         };

谢谢

表达式
&my\u struct2->custom\u struct\u 1
没有达到您期望的效果。它返回指针的地址,即指向
自定义结构\u 1
结构的指针的指针

不要使用操作员的地址
&
,它应该工作得更好

在很多地方都有这个问题,实际上几乎所有使用指针的地方都是指针的地址

您可能还有另一个问题,除非您没有向我们显示
func1
的完整代码,并且在使用
my\u dumping\u struct
指针之前没有初始化它。这意味着它将指向一个看似随机的地址,对该指针的所有解引用都将是未定义的行为,很可能是崩溃


事实上,你应该有很多编译器警告,对你大喊大叫。malloc似乎解决了这个问题

custom_struct *my_dumping_struct  = malloc(sizeof *my_dumping_struct);

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

,因为您发布了几乎所有其他内容,我不认为您可以发布
自定义结构1
自定义结构2
自定义结构
的定义??请回答问题;不作为评论。当您使用它时,编译的代码将是一个不错的选择。编写时,
func1()
有两个未定义的变量,并使用未声明的类型
func2()
func3()。这是非常可取的。不要“告诉”我们你的代码;只需发布它,以及您的期望、您的收获和您的猜测都是错误的。我想您是对的,我们打算这么做:)@WhozCraig抱歉无法共享整个代码,即使我可以,也可能需要很长时间才能获取,每个结构都在一个不同的头文件中定义,并且有比所描述的更多的元素。现在我们有了像
p\u flddata
p\u fmt
,和
p\u sub
,但完全不知道它们是什么。抛开这些不谈,把你所遇到的基本问题的一个小的、自包含的、可编译的例子放在一起。抛出一堆未定义的数据类型和变量最终是一条无路可走的漫长道路。在整理样本时,如果您自己发现了问题并彻底解决了问题,请不要感到惊讶。它发生的次数比你想象的要多。很抱歉,部分初始代码被遗忘了,我将尝试编译示例。令人惊讶的是,我没有收到任何编译警告。转储结构未初始化。我的理解是memset会将其全部填充为零,当传递给其他函数时,它可能会根据course@wassim当你声明一个局部变量时,不管它是否是指针,它不是初始化,这意味着调用函数时,该变量的内容将是该变量位置上堆栈上的任何内容。这意味着指针将指向内存中未知的某处,甚至可能指向包含另一个结构的某些数据的某处。取消引用此未初始化指针将访问此随机内存。您必须始终初始化指针,或者将它分配给另一个指针,或者为它应该指向的对象分配内存。@wassim如果您没有收到警告,您应该启用更多警告(我建议在GCC上启用
-Wall-Wextra
(至少))。这些问题很严重,如果您不理解它们,将导致(可能严重且难以跟踪)崩溃。@wassim您还应该了解操作员
&
地址与取消引用操作员
*
->
地址之间的区别。