C 尝试访问传递给solaris中函数的结构指针时的核心转储
我有一个相当复杂的代码,它在AIX上运行良好,但在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
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您还应该了解操作员&
地址与取消引用操作员*
、->
和
地址之间的区别。