фрагменты кода из двух исходных файлов C:указатель изменения возвращаемого значения после вызова функции
Ac
Channel *testChannelGet()
{
Channel *ch = channelGet (parser,parserCh);
return ch;
}
Bc
Channel *channelGet(UINT8 parser, UINT16 parserCh)
{
chnl.player = &solPlayer;
return((Channel *)&chnl);
}
компилировать как файлы, так и создавать статические и разделяемые библиотеки , Теперь я вызываю testChannelGet из примера программы. Когда я связываю его со статической библиотекой, он отлично работает. Но если я свяжу его с разделяемой библиотекой, ее SEGFAULTing. Отладка говорит мне, что указатель, возвращенный из channelGet, меняет момент его возвращения. Выход GDB ниже.
174 Channel *ch = channelGet (parser,parserCh);
(gdb) s
channelGet (parser=1 '\001', parserCh=1) at B.c:15174
15174 chnl.player = &solPlayer;
(gdb) n
15175 return((Channel *)&chnl);
(gdb) p ((Channel *)&chnl)
$1 = (Channel *) 0x7ffff7fed1a0
(gdb) n
15176 }
(gdb) n
testChannelGet at A.c:175
175 return ch;
(gdb) p ch
$2 = (Channel *) 0xfffffffff7fed1a0
Кажется, что значение указывает адрес другого смещения сейчас - 0xfffffffff7fed1a0 против 0x7ffff7fed1a0. Последние байты в обоих адресах одинаковы.
Любые подсказки? Я пробовал вариант -fPIC безрезультатно.
Что такое 'chnl' и где он определен? – Jan
Его глобальная переменная, определенная в B.c - Channel chnl; и инициализируется в другом файле, chnl = malloc (sizeof (Channel *)); – Vasu
Может случиться так, что при вызове динамической библиотеки инициализация не будет выполнена? –