2013-04-30 4 views
0

AIX에서 제대로 작동하지만 Solaris에서 코어 덤프가 제대로 작동하는 코드가 있습니다. 가능한 한 단순화하려고했습니다. 이하 solaris의 함수에 전달 된 구조체에 대한 포인터에 액세스 할 때 코어 덤프가 발생했습니다.

함수

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

이 필드 아래

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

으로 첫 번째 포인터을 갖는 제 2 구조에 대한 포인터를 갖는 글로벌 structrue 것은 유동

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

를 이용하여 다른 기능 그것은 여전히 ​​코어 덤프에 대한 참조를 전달 제에 대한 포인터없이 댐핑 구조를 형성 multipile 같은 것을 시도했다. 구조의

편집

정의는 다음과 같습니다 :

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; 
     }; 

감사

+0

도움이 듯, 난 당신이 게시 할 수있는 생각하지 않습니다 'custom_struct_1','custom_struct_2','custom_struct'의 정의? * 질문에 제발; ** ** 주석이 아닙니다 **. 여기에있는 동안, * 컴파일 *하는 코드는 좋은 손길이 될 것입니다. 쓰여진'func1()'은 두 개의 정의되지 않은 변수를 가지며 선언되지 않은 타입을 사용합니다. 'func2()'와'func3()'는별로 좋지 않습니다. [SSCCE] (http://www.sscce.org)는 매우 바람직합니다.우리에게 코드에 대해 "말하지"마십시오. 당신이 기대하고있는 것, 당신이 얻고있는 것, 그리고 당신이 추측 한 것은 잘못된 것입니다. – WhozCraig

+0

당신이 옳다고 생각합니다. :) – wassim

+0

@WhozCraig 유감스럽게도 전체 코드를 공유 할 수는 없지만 각기 다른 헤더 파일에 정의되어 있으며, 설명 된 것보다 훨씬 더 많은 요소. – wassim

답변

0

malloc에 ​​문제 모든 제안에 대한

custom_struct *my_dumping_struct = malloc(sizeof *my_dumping_struct); 

분명 아니었다면 죄송하고 감사를 해결하고

0

당신이 할 기대하지 않는 표현 &my_struct2->custom_struct_1. 포인터의 주소, 즉 custom_struct_1 구조체에 대한 포인터의 포인터를 반환합니다.

&의 주소 연산자를 사용하지 마십시오. 훨씬 더을 사용해야합니다.

이 문제는 더 많은 곳에서 실제로 포인터의 주소를 사용하는 포인터를 사용하는 거의 모든 곳에서 발생합니다.

func1의 전체 코드를 표시하고 사용하기 전에 my_dumping_struct 포인터를 초기화하지 않는 한 다른 문제가있을 수도 있습니다. 즉, 무작위로 보이는 주소를 가리키며 그 포인터의 모든 역 참조가 정의되지 않은 동작 이고 가장 가능성이있는 충돌입니다.

사실, 개의 컴파일러 경고가이 모든 것에 대해 비명을 지르고 있어야합니다. 당신은 거의 모든 다른 게시 때문에

+0

놀랍게도 아니오, 컴파일 경고가 표시되지 않습니다. 덤프 구조체가 초기화되지 않았습니다. 내 이해는 memset은 그것을 0으로 채우고, 다른 함수에 전달할 때 물론 논리에 따라 다른 값으로 채워질 수도 있습니다. – wassim

+0

@wassim 로컬 변수를 선언 할 때 포인터인지 아닌지는 중요하지 않습니다 , 그것은 초기화되지 않습니다. 즉, 변수의 내용은 함수가 호출 될 때 해당 변수 위치의 스택에있는 모든 것입니다. 이는 포인터가 메모리에서 알 수없는 곳을 가리키고 다른 곳의 데이터를 담고있는 어딘가를 가리키고 있음을 의미합니다. 이 초기화되지 않은 포인터를 역 참조하면이 임의의 메모리에 액세스합니다. 포인터를 다른 포인터에 할당하거나 포인터가 가리켜 야 할 곳을 위해 메모리를 할당하여 ** 항상 ** 초기화해야합니다. –

+0

@wassim 경고가 표시되지 않으면 더 많은 경고를 켜야합니다 (나는 GCC에서'-Wall -Wextra'를 권장합니다). 이 문제는 심각하며 이해가되지 않으면 충돌이 발생할 수 있습니다. –