2013-04-30 2 views
0

У меня довольно сложный код, который отлично работает на AIX, но ядро ​​демпинга в Solaris. Я старался сделать его максимально упрощенным.Ядро дампа при попытке получить доступ к указателю на структуру, переданному функции в solaris

Ниже глобальная structrue, имеющий указатель на функцию

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

и передавая его со ссылкой на другие функции, которые она до сих пор дампы.

EDIT

Определение структуры, как показано ниже:

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

таНос, казалось, решить проблему

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 заполнит все нули, когда передается другим функциям, оно может быть заполнено другими значениями в зависимости от логики курса – wassim

+0

@wassim Когда вы объявляете локальную переменную, не имеет значения, является ли это указателем или нет , это не инициализируется. Это означает, что содержимое этой переменной будет находиться в стеке в этой позиции переменных при вызове функции. Это означает, что указатели укажут на то, что неизвестно в памяти, возможно, даже где-то, где содержатся некоторые данные для другой структуры. Вызов этого неинициализированного указателя будет доступ к этой случайной памяти. Вы должны ** всегда ** инициализировать указатели, назначая его другому указателю или выделяя память для того, на что она должна указывать. –

+0

@wassim Если вы не получили предупреждения, вы должны включить дополнительные предупреждения (я рекомендую '-Wall -Wextra' на GCC (по крайней мере)). Эти проблемы серьезны и вызовут (возможно, тяжелые и трудные для отслеживания) сбои, если вы их не понимаете. –