Khi thiết kế một ngôn ngữ lập trình mới, có an toàn khi giả sử rằng một int và con trỏ có cùng kích thước trên máy không?Có an toàn khi giả định rằng một con trỏ có kích thước của một int trong C không?
Trả lời
Không. Con trỏ có thể lớn hơn hoặc nhỏ hơn kích thước nguyên. Nếu bạn cần truyền con trỏ dưới dạng số nguyên vì một số lý do (như thực hiện số nguyên, thay vì con trỏ, số học), chúng được đảm bảo để khớp với một số intptr_t.
Chúng không được đảm bảo phù hợp với kích thước_t như được đề xuất trong câu trả lời khác, nhưng trong thực tế, không chắc là chúng sẽ không, vì kích thước địa chỉ lớn nhất thường bằng địa chỉ lớn nhất.
không, nhưng con trỏ phải có cùng kích thước với intptr_t.
Có vẻ như sizeof (int)! = sizeof (int *) với máy và trình biên dịch mà tôi đang sử dụng tại thời điểm này ... vì vậy nếu một cái gì đó tương tự là an toàn, nó không liên quan đến int . – compman
@ user9521: Như Dan nói, luôn sử dụng các loại 'size_t'. Vấn đề chính với việc chuyển đổi mã thành x64 là sự phổ biến của những người giả sử kích thước int là như nhau, thực tế đó đã bị phản đối nhiều năm trước. – Orbling
-1 - Trên thực tế bạn có thể đúng, nhưng de jure bạn là sai. Trên kiến trúc bộ nhớ phân đoạn (và các loại bệnh lý khác), size_t có thể nhỏ hơn intptr_t. http://stackoverflow.com/questions/1464174/size-t-vs-intptr-t. –
Tôi nghĩ rằng bạn có nghĩa là kích thước của các loại dữ liệu được xác định bởi nền tảng không phải là C lang. Theo hiểu biết tốt nhất của tôi, C không xác định bất kỳ kích thước cụ thể nào cho các kiểu dữ liệu. Câu trả lời cho câu hỏi của bạn là bạn không thể giả định điều này, ví dụ trên win32 sizeof (int) == sizeof (con trỏ) == 4 byte tuy nhiên trên win64 sizeof (int) == 4 và sizeof (pointer) == 8
Ngôn ngữ C xác định một số kích thước dữ liệu tối thiểu (ví dụ: size_t phải có ít nhất 16 bit), kích thước quan hệ (dài không thể ngắn hơn), cũng như một số loại kích thước cố định (uint32_t chính xác là 32 bit). –
@ Joe bạn nói đúng, tôi nên hạn chế câu trả lời của tôi về kích thước tương đối của int và con trỏ. – Gaurav
@Joe: Có vẻ như uint32_t lần đầu tiên xuất hiện trong tiêu chuẩn C trong C99 (xem http://en.wikipedia.org/wiki/Stdint.h) bởi vì đó là khi stdint.h trở thành một phần của tiêu chuẩn. (Tôi không biết nếu triển khai đôi khi sẽ cung cấp nó trước khi C99.) – compman
Không, đặc biệt là trong môi trường 64 bit:
LP64 Điều này bao gồm * nix môi trường nhưng điều này cũng đúng trong cửa sổ cho LLP64.
Không, hoàn toàn không. Nhiều trình biên dịch không có chúng như cùng kích thước.
Không; trên máy MacOS X 10.6.5 của tôi. máy, int
là 32 bit và một con trỏ là 64 bit theo mặc định.
Nếu bạn cần số nguyên đúng kích cỡ để giữ con trỏ, hãy sử dụng #include <inttypes.h>
(hoặc <stdint.h>
) và uintptr_t
- giả sử bạn có hỗ trợ C99 hoặc có thể mô phỏng nó.
Tôi tin rằng hạt nhân Linux chuyển con trỏ dưới dạng unsigned long's. Chúng được đảm bảo ít nhất có cùng kích thước với con trỏ :)
No. Linux đảm bảo chúng có cùng kích thước. Ngôn ngữ C không hứa hẹn gì cả. –
Đây thực sự là câu trả lời hay vì nó cho thấy một số hành vi của hạt nhân, và họ không quan tâm đến các quy tắc ngôn ngữ C. Nó gây ra lỗi trong cuộc sống thực, như bộ xử lý [Bug 4441: VIA C7-D của OpenSSL: Treo trong 30-test_afalg.t] (https://rt.openssl.org/Ticket/Display.html?id=4441). Nó xuất hiện là vì hạt nhân đang đúc con trỏ (i686, 32-bit) để tích phân kích thước lớn hơn (unsigned long và sau đó được lưu trữ trong một '__u64'). – jww
- 1. C con trỏ: trỏ đến một mảng có kích thước cố định
- 2. Có an toàn khi giữ các con trỏ C++ trong C# không?
- 3. Xóa C# Con trỏ Không an toàn
- 4. Con trỏ C++ có kích thước bit cụ thể
- 5. Kích thước của con trỏ có thay đổi theo C không?
- 6. Con trỏ có thể có kích thước khác nhau không?
- 7. Lấy kích thước con trỏ trong C
- 8. Trong C, có bao giờ an toàn khi đúc con trỏ hàm variadic đến một con trỏ hàm với các đối số hữu hạn không?
- 9. Truy cập đọc đồng thời trên một mảng int []: Có an toàn không? Có nhanh không?
- 10. Kích thước của một lớp với con trỏ 'này'
- 11. Kích thước của con trỏ là gì?
- 12. Có an toàn để "upcast" một con trỏ phương pháp và sử dụng nó với con trỏ lớp cơ sở?
- 13. C# lý do tại sao sizeof là không an toàn và làm thế nào để có được kích thước của một cấu trúc một cách an toàn?
- 14. Có thể gọi memset() với một con trỏ null nếu kích thước là 0 không?
- 15. Bạn có nên sử dụng con trỏ (mã không an toàn) trong C# không?
- 16. Làm thế nào an toàn là nó giả định rằng hầu hết người dùng sẽ có JS kích hoạt?
- 17. Kích thước con trỏ có khác nhau giữa dữ liệu và con trỏ hàm không?
- 18. Kích thước của một cấu trúc có hai con trỏ void là 4?
- 19. Cách xóa an toàn nhiều con trỏ
- 20. Có an toàn khi sử dụng con trỏ để thay đổi giá trị trong các khối không?
- 21. Có an toàn khi trả lại cấu trúc trong C hoặc C++ không?
- 22. Có cách nào để xác định kích thước của một vector STL lồng nhau C++ không?
- 23. Có an toàn khi gán nullptr cho biến con trỏ hàm không?
- 24. Tại sao sizeof (param_array) là kích thước của con trỏ?
- 25. Looping một mảng kích thước cố định mà không cần xác định kích thước của nó trong C
- 26. Cách lấy kích thước con trỏ trong C#
- 27. kích thước của mảng và kích thước của con trỏ nhân vật nhân vật
- 28. Tại sao bộ đệm kích thước cố định (mảng) phải không an toàn?
- 29. Có thể chuyển một tham chiếu đến một con trỏ từ Excel VBA sang C++ không?
- 30. Tìm kích thước của một chuỗi chỉ bởi một con trỏ
Có thể là câu hỏi tràn ngăn xếp. – Orbling
Xem thêm: [C++: Có an toàn khi đưa con trỏ tới int và sau đó quay lại con trỏ không?] (Http://stackoverflow.com/questions/3567905/c-is-it-safe-to-cast-pointer- to-int-and-later-back-to-pointer-again) – Shog9
bản sao có thể có của [sizeof (int) == sizeof (void \ *)?] (http://stackoverflow.com/questions/502811/sizeof- int-sizeof-void) – Amro