Làm thế nào để c tìm thấy tại thời gian chạy kích thước của mảng? thông tin về kích thước mảng hoặc giới hạn của mảng được lưu trữ ở đâu?Làm thế nào để sizeof (Array) làm việc
Trả lời
sizeof(array)
được thực hiện hoàn toàn bởi trình biên dịch C. Vào thời điểm chương trình được liên kết, những gì trông giống như một cuộc gọi sizeof()
cho bạn đã được chuyển đổi thành một hằng số.
Ví dụ: khi bạn biên dịch mã C này:
#include <stdlib.h>
#include <stdio.h>
int main(int argc, char** argv) {
int a[33];
printf("%d\n", sizeof(a));
}
bạn nhận được
.file "sz.c"
.section .rodata
.LC0:
.string "%d\n"
.text
.globl main
.type main, @function
main:
leal 4(%esp), %ecx
andl $-16, %esp
pushl -4(%ecx)
pushl %ebp
movl %esp, %ebp
pushl %ecx
subl $164, %esp
movl $132, 4(%esp)
movl $.LC0, (%esp)
call printf
addl $164, %esp
popl %ecx
popl %ebp
leal -4(%ecx), %esp
ret
.size main, .-main
.ident "GCC: (GNU) 4.1.2 (Gentoo 4.1.2 p1.1)"
.section .note.GNU-stack,"",@progbits
Các $132
ở giữa là kích thước của mảng, 132 = 4 * 33. Chú ý rằng có không có hướng dẫn call sizeof
- không giống như printf
, là một chức năng thực sự.
sizeof()
sẽ chỉ hoạt động cho một mảng kích thước cố định (có thể là tĩnh, xếp chồng dựa trên hoặc trong cấu trúc).
Nếu bạn áp dụng nó vào một mảng được tạo với malloc
(hoặc mới trong C++), bạn sẽ luôn nhận được kích thước của một con trỏ.
Và có, điều này được dựa trên thông tin thời gian biên dịch.
mảng kích thước cố định không nhất thiết phải dựa trên xếp chồng. C không có toán tử mới. – ysth
Bạn nói đúng, tôi sẽ chỉnh sửa một chút. –
Bạn đã quên khoảng C99 VLA - các mảng có độ dài thay đổi. –
sizeof (Mảng) được tra cứu tại thời gian biên dịch, không phải lúc chạy. Thông tin không được lưu trữ.
Bạn có thể quan tâm đến việc triển khai kiểm tra giới hạn không? Nếu vậy, có một số cách khác nhau để đi về điều đó.
sizeof
cho biết kích thước của biến, không phải kích thước của đối tượng bạn trỏ đến (nếu có.) sizeof(arrayVar)
sẽ trả về kích thước mảng theo byte nếu và chỉ khi arrayVar
được khai báo trong phạm vi mảng và không phải là một con trỏ.
Ví dụ:
char myArray[10];
char* myPtr = myArray;
printf("%d\n", sizeof(myArray)) // prints 10
printf("%d\n", sizeof(myPtr)); // prints 4 (on a 32-bit machine)
sizeof là thời gian biên dịch thuần túy trong C++ và C trước C99. Bắt đầu với C99 có biến mảng chiều dài:
// returns n + 3
int f(int n) {
char v[n + 3];
// not purely a compile time construct anymore
return sizeof v;
}
Điều đó sẽ đánh giá sizeof
toán hạng, vì n
vẫn chưa được biết tại thời gian biên dịch. Chỉ chỉ áp dụng cho các mảng độ dài thay đổi: Các toán hạng hoặc loại khác vẫn thực hiện tính toán sizeof tại thời gian biên dịch. Đặc biệt, các mảng có kích thước được biết đến tại thời gian biên dịch vẫn được xử lý như trong C++ và C89. Kết quả là, giá trị trả về bởi sizeof
không phải là hằng số thời gian biên dịch (biểu thức liên tục) nữa. Bạn không thể sử dụng nó khi một giá trị như vậy được yêu cầu - ví dụ khi khởi tạo biến tĩnh, trừ khi phần mở rộng của trình biên dịch cụ thể cho phép nó (chuẩn C cho phép triển khai có phần mở rộng cho những gì nó xử lý như hằng số).
Tốt bạn đề cập đến VLA C99. Tuy nhiên, câu trả lời của bạn nên nhấn mạnh rằng ngay cả trong C99, các mảng kích thước cố định có kích thước của chúng được tính toán tại thời gian biên dịch - nó chỉ là các VLA có kích thước của chúng được tính khi chạy. Và có thể, kết quả là bạn không thể luôn sử dụng 'sizeof (mảng)' làm hằng số trong C99. –
ồ phải. không thấy sự mơ hồ đó trong câu trả lời của tôi. –
ok, giờ ngủ cho tôi. sau đó tôi sẽ thức dậy và hét lên về tất cả những lỗi chính tả trong câu trả lời của tôi: p –
- 1. Làm thế nào để Deserialize JSON Array?
- 2. VBA Public Array: làm thế nào?
- 3. Làm thế nào để chuyển đổi System.Drawing.Image để Byte Array?
- 4. Làm thế nào để jdbc làm việc
- 5. Làm thế nào Lambda biểu làm việc
- 6. Làm thế nào để khởi Array với Loại Tuỳ chỉnh
- 7. Làm thế nào để chuyển đổi SimpleXMLObject thành PHP Array?
- 8. SQLite làm thế nào để khai báo như Byte Array?
- 9. Rails, Ruby, làm thế nào để sắp xếp một Array?
- 10. toán tử tăng không làm việc với sizeof
- 11. Làm thế nào để chuyển đổi chuỗi Array đúp Array trong một dòng
- 12. sizeof làm gì?
- 13. Sizeof hoạt động như thế nào? Làm thế nào tôi có thể viết của riêng tôi?
- 14. Làm thế nào VIM Autocomplete làm việc
- 15. Làm thế nào để làm việc với ssh trong PhpStorm?
- 16. Làm thế nào để tăng :: tinh thần :: hold_any làm việc?
- 17. Làm thế nào để chuỗi obfuscation trong obfuscators làm việc?
- 18. Làm thế nào để "\ x" làm việc trong một String?
- 19. Python: Làm thế nào để bộ làm việc
- 20. Làm thế nào để có được VBO làm việc
- 21. Làm thế nào để Enumerators làm việc trong Ruby 1.9.1?
- 22. Làm thế nào để sbrk() làm việc trong C++?
- 23. Làm thế nào để multiprocessing.Manager() làm việc trong python?
- 24. Làm thế nào để memchr() làm việc dưới mui xe?
- 25. Làm thế nào để std :: bản đồ iterator làm việc?
- 26. Làm thế nào để OfType <T>() Làm việc?
- 27. làm thế nào để làm việc scalaz.Validation loopSuccess và loopFailure
- 28. Làm thế nào để đồng đô la và số hiệu cùng nhau làm việc trong perl?
- 29. Làm cách nào để chuyển đổi Array [Node] thành NodeSeq?
- 30. Làm thế nào để có được độ dài của một mảng trong C? Là "sizeof" một giải pháp?
lol! Điều đó sẽ dạy tôi không kiểm tra rằng tôi đặt tay mình vào đúng nơi ...Cảm ơn vì sửa chữa Rob –
Ah, tôi thấy bây giờ, David phải là một người đánh máy mù chạm với một rối loạn chức năng xúc giác ở đầu ngón tay của mình :-) Hài hước như thế nào c và e là okay - Tôi đã phải kiểm tra xem mọi chữ cái khác là một bên trái của vị trí chính xác. – paxdiablo
Tôi đoán bàn tay trái của tôi ở đúng vị trí nhưng tay phải của tôi đã bị dời đi một phím ở bên trái ... có vẻ như một sai lầm dễ gây ra - nếu bạn đang gõ câu trả lời trong khi xem TV ;-) –