Đoạn mã từ hai tập tin nguồn C:con trỏ thay đổi giá trị trả về sau khi gọi hàm
Ac
Channel *testChannelGet()
{
Channel *ch = channelGet (parser,parserCh);
return ch;
}
Bc
Channel *channelGet(UINT8 parser, UINT16 parserCh)
{
chnl.player = &solPlayer;
return((Channel *)&chnl);
}
tôi biên dịch cả tập tin và tạo ra một tĩnh và thư viện chia sẻ . Bây giờ tôi gọi testChannelGet từ một chương trình mẫu. Khi tôi liên kết nó với thư viện tĩnh, nó hoạt động hoàn hảo. Nhưng nếu tôi liên kết nó với thư viện được chia sẻ, SEGFAULTing của nó. Gỡ lỗi cho tôi biết rằng con trỏ được trả về từ channelGet đang thay đổi thời điểm nó trả về. Sản lượng GDB dưới đây.
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
Có vẻ như giá trị địa chỉ trỏ đến chênh lệch khác ngay bây giờ - 0xfffffffff7fed1a0 và 0x7ffff7fed1a0. Các byte cuối cùng trong cả hai địa chỉ đều giống nhau.
Bất kỳ gợi ý? Tôi đã thử tùy chọn -fPIC không có kết quả.
'chnl' là gì và được xác định ở đâu? – Jan
Biến toàn cầu của nó được xác định trong B.c - Kênh chnl; và được khởi tạo trong một tệp khác, chnl = malloc (sizeof (Channel *)); – Vasu
Nó có thể là trường hợp mà khi bạn gọi lib động, khởi tạo không được thực hiện? –