Tôi đã gặp phải điều gì đó mà tôi không hiểu rõ. Có một nguyên mẫu hàm:Con trỏ chức năng với GCC, gán địa chỉ
typedef void (* TMain) (void);
và một biến chức năng:
TMain myFunc = MyFunc;
...
myFunc();
này hoạt động tốt, tất nhiên. Tại sao nó không phải.
Từ tệp MAP tôi biết rằng "MyFunc" ở vị trí 0x20100. Và bây giờ điều buồn cười. Sau khi gán "myFunc = MyFunc;" biến "myFunc" không chứa giá trị 0x20100 nhưng thay vì 0x20101!
Vấn đề của tôi là, tôi cần gọi hàm mà tôi biết địa chỉ từ bảng. Vì vậy, tôi nghĩ tôi có thể làm điều đó như thế
myFunc = (TMain) myTable [ 5 ]; // that would be 0x20100
myFunc(); // which produces a proper crash
Tuy nhiên Nếu tôi làm
myFunc = (TMain) ((Int8 *) myTable [ 5 ] + 1);
myFunc();
sau đó nó hoạt động.
Điều gì xảy ra ở đây? Tôi có luôn phải thêm một khoản bù trừ 1 hay ít nhiều là ngẫu nhiên không? Hoặc có cách nào tốt hơn (và hoạt động) để hoàn thành nhiệm vụ không?
Cảm ơn rất nhiều vì bất kỳ gợi ý nào. Walter
Không chắc chắn, nhưng điều này có thể phụ thuộc vào kiến trúc. Vì vậy, có thể muốn nói đó là kiến trúc đích. – phimuemue
Mảng 'myTable' thuộc loại' TMain [] '? Tôi đoán nó không phải là vì bạn đang đúc nó. –
Một số câu hỏi dành cho bạn: Bạn đang sử dụng nền tảng nào (ARM, x86 ...)? Bạn đã bao giờ kiểm tra địa chỉ thực tế của hàm bằng trình gỡ rối chưa? Bạn có thể thấy cách trình biên dịch tạo ra cuộc gọi gián tiếp "myFunc()" không? –