2011-12-18 55 views
5

Đ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ả.

+0

'chnl' là gì và được xác định ở đâu? – Jan

+0

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

+0

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? –

Trả lời

5

Có mẫu thử trong phạm vi cho channelGet() trong A.c không?

Nếu không, kết quả mà bạn đang nhìn thấy có thể được giải thích như sau:

  • channelGet() được giả định trở int (do thiếu nguyên mẫu), do đó kết quả được cắt ngắn để 0xf7fed1a0
  • sau đó nó được truyền đến một con trỏ 64 bit, do đó hãy mở rộng ký hiệu thành 0xfffffffff7fed1a0

(Bạn sẽ nhận được khiếu nại về điều này nếu bạn biên dịch với cảnh báo được bật, tất nhiên ...)

+0

+1: phôi gần như luôn luôn sai trong C :) – pmg

+0

Tôi có nguyên mẫu trong tệp tiêu đề, được bao gồm trong cả Ac và BcVà nó sẽ làm việc cho các thư viện tĩnh nếu vấn đề là thiếu nguyên mẫu? – Vasu

+0

BTW khi tôi sử dụng thư viện tĩnh, các địa chỉ luôn nằm trong phạm vi 32 bit. Tôi có cần bất kỳ cờ biên dịch nào khi tạo lib được chia sẻ không? Tôi đang sử dụng - gcc -fPIC -shared -Wl, -soname – Vasu

1

Chạy chương trình của bạn dưới valgrind. Tìm và sửa bất kỳ lỗi nào mà nó báo cáo.

+0

nó chạy hoàn hảo trong valgrind! thats vexing tôi quá: ( – Vasu

+1

Sau đó cố gắng để chưng cất vấn đề của bạn xuống đến một ví dụ hoàn chỉnh nhưng tối thiểu và chúng tôi sẽ có một crack vào nó. Đừng quên bao gồm quá trình xây dựng bạn đang sử dụng, có thể là thủ phạm. –

Các vấn đề liên quan