Là kích thước của Cv int int 2 byte hay 4 byte?


168

Có một biến Integer trong C chiếm 2 byte hoặc 4 byte không? Các yếu tố mà nó phụ thuộc vào là gì?

Hầu hết các sách giáo khoa nói rằng các biến số nguyên chiếm 2 byte. Nhưng khi tôi chạy một chương trình in các địa chỉ liên tiếp của một mảng các số nguyên thì nó cho thấy sự khác biệt của 4.



1
intchỉ là một trong một số loại số nguyên . Bạn đã hỏi về kích thước của "số nguyên"; bạn có thể có nghĩa là để hỏi về kích thước của int.
Keith Thompson

3
Và bạn nên tìm sách giáo khoa tốt hơn. Sách giáo khoa có giá trị int2 byte (a) có thể đề cập đến một hệ thống cũ và (b) không thể làm rõ rằng kích thước sẽ thay đổi từ hệ thống này sang hệ thống khác. Cuốn sách hay nhất về C là "Ngôn ngữ lập trình C" của Kernighan và Ritchie, mặc dù nó có một số kinh nghiệm lập trình. Xem thêm chất vấn 18.10 của FAQ comp.lang.c .
Keith Thompson

2
Hãy thử #define int int64_ttrên nền tảng 64 bit, vì vậy cũng không. Chỉ cần sử dụng sizeof. ;-)
netcoder

Câu trả lời:


183

Tôi biết nó bằng sizeof(int). Kích thước của một intphụ thuộc thực sự là trình biên dịch. Ngày trước, khi bộ xử lý là 16 bit, một intlà 2 byte. Ngày nay, nó thường là 4 byte trên hệ thống 32 bit cũng như 64 bit.

Tuy nhiên, sử dụng sizeof(int)là cách tốt nhất để lấy kích thước của một số nguyên cho hệ thống cụ thể mà chương trình được thực thi.

EDIT: Đã sửa lỗi câu lệnh sai int8 byte trên hầu hết các hệ thống 64 bit. Ví dụ, nó là 4 byte trên GCC 64 bit.


31
@RajivPrathap: Chà, nó phụ thuộc vào trình biên dịch, nhưng trình biên dịch quyết định liệu nó có phụ thuộc vào máy hay không. :)
dùng541686

2
Nếu bạn cần kích thước cho preproccesor, bạn có thể kiểm tra các macro được xác định trước như INT_MAX. Nếu giá trị không phải là giá trị mà mã của bạn mong đợi, thì kích thước byte của int sẽ khác với tổ hợp trình biên dịch / nền tảng hiện tại.
Người bán Walt

3
Không chỉ phụ thuộc vào máy, nó còn phụ thuộc vào hệ điều hành đang chạy trên máy. Ví dụ dài trong Win64 là 4 byte trong khi dài trong Linux64 là 8 byte.
Cem Kalyoncu

9
Sai lầm. trên hầu hết các hệ thống 64 bit int vẫn là 4 byte en.wikipedia.org/wiki/64-bit_computing#64-bit_data_models
phuclv

7
sizeof(int)có thể là bất kỳ giá trị từ 1. Một byte không bắt buộc phải là 8 bit và một số máy không có đơn vị địa chỉ 8 bit (về cơ bản là định nghĩa của một byte trong tiêu chuẩn). Câu trả lời là không chính xác nếu không có thêm thông tin.
quá trung thực cho trang web này

102

Đây là một trong những điểm trong C có thể gây nhầm lẫn lúc đầu, nhưng tiêu chuẩn C chỉ xác định phạm vi tối thiểu cho các loại số nguyên được đảm bảo được hỗ trợ. intđược đảm bảo có thể giữ -32767 đến 32767, yêu cầu 16 bit. Trong trường hợp đó int, là 2 byte. Tuy nhiên, việc triển khai là miễn phí vượt quá mức tối thiểu đó, vì bạn sẽ thấy rằng nhiều trình biên dịch hiện đại tạo ra int32 bit (cũng có nghĩa là 4 byte khá phổ biến).

Lý do cuốn sách của bạn nói 2 byte có lẽ là vì nó đã cũ. Đã có lúc, đây là chuẩn mực. Nói chung, bạn phải luôn luôn sử dụng sizeoftoán tử nếu bạn cần tìm hiểu xem có bao nhiêu byte trên nền tảng bạn đang sử dụng.

Để giải quyết vấn đề này, C99 đã thêm các loại mới mà bạn có thể yêu cầu một số nguyên có kích thước nhất định, ví dụ int16_thoặc int32_t. Trước đó, không có cách phổ quát nào để lấy số nguyên có chiều rộng cụ thể (mặc dù hầu hết các nền tảng đều cung cấp các loại tương tự trên cơ sở mỗi nền tảng).


7
@nevanking: Trên máy bổ sung của hai người (đó là mọi máy tôi biết ...), vâng. Nhưng, C không đảm bảo nó là trường hợp.
FatalError

@nevanking Tôi hoàn toàn mới với C, nhưng không phải là 32767 vì nếu không nó sẽ sử dụng một bit khác | byte? Hãy tưởng tượng, tôi có thể giữ 3 chữ số (0 hoặc 1), vì vậy tôi có thể đi từ 000 đến 111 (là số thập phân 7). 7 là đúng trước số mũ của 2. Nếu tôi có thể đi đến 8 (1000) thì tôi có thể sử dụng 4 chữ số đó cho đến hết 15! Chẳng hạn như 32767 ở ngay trước số mũ 2, làm cạn kiệt tất cả các bit | byte có sẵn.
RGS

3
@RSerrao Tôi cũng không phải là chuyên gia về C nhưng AFAIK cho các số dương, nó ít hơn một số âm tối đa. Vì vậy, -8 đến 7, -256 đến 255, v.v. Số âm không phải đếm số không.
vua nevan

1
"16 bit. Trong trường hợp đó, int, là 2 byte" có thể sai, nếu CHAR_BIT là 16, sizeof (int) có thể là 1 byte (hoặc char).
12431234123412341234123 ngày

6
@nevanking: chỉ khi bạn giả sử đại diện bổ sung cho 2 đã ký int. C không đưa ra giả định đó. Hệ thống bổ sung và cường độ ký hiệu của 1 không thể biểu thị -32768bằng 16 bit; đúng hơn, họ có hai đại diện cho số không (tích cực và tiêu cực). Đó là lý do tại sao phạm vi tối thiểu cho một int[-32767..32767].
John Bode

33

Không có câu trả lời cụ thể. Nó phụ thuộc vào nền tảng. Nó được xác định thực hiện. Nó có thể là 2, 4 hoặc một cái gì đó khác.

Ý tưởng đằng sau intlà nó được cho là phù hợp với kích thước "từ" tự nhiên trên nền tảng đã cho: 16 bit trên nền tảng 16 bit, 32 bit trên nền tảng 32 bit, 64 bit trên nền tảng 64 bit, bạn hiểu ý. Tuy nhiên, với mục đích tương thích ngược, một số trình biên dịch thích bám vào 32 bit intngay cả trên nền tảng 64 bit.

Thời gian của 2 byte intđã hết từ lâu (nền tảng 16 bit?) Trừ khi bạn đang sử dụng một số nền tảng nhúng với kích thước từ 16 bit. Sách giáo khoa của bạn có lẽ rất cũ.


2
The idea behind int was that it was supposed to match the natural "word" size on the given platform- Đây là những gì tôi đang tìm kiếm. Bất kỳ ý tưởng những lý do có thể là gì? Trong một thế giới tự do, int có thể chiếm bất kỳ số byte liên tiếp nào trong bộ nhớ phải không? 8, 16 bất cứ điều gì
bholagabbar

19

Câu trả lời cho câu hỏi này phụ thuộc vào nền tảng bạn đang sử dụng.
Nhưng không phân biệt nền tảng, bạn có thể tin tưởng các loại sau:

 [8-bit] signed char: -127 to 127
 [8-bit] unsigned char: 0 to 255
 [16-bit]signed short: -32767 to 32767
 [16-bit]unsigned short: 0 to 65535
 [32-bit]signed long: -2147483647 to 2147483647
 [32-bit]unsigned long: 0 to 4294967295
 [64-bit]signed long long: -9223372036854775807 to 9223372036854775807
 [64-bit]unsigned long long: 0 to 18446744073709551615

3
Ai đó đã chỉnh sửa bài đăng của bạn để "sửa" các phạm vi, nhưng tôi không chắc liệu chỉnh sửa của bạn có phản ánh đúng ý định của bạn hay không. Nó giả định thực hiện bổ sung của hai, điều này sẽ đúng trong hầu hết các trường hợp, nhưng không phải tất cả. Vì câu trả lời của bạn đặc biệt chỉ ra sự phụ thuộc vào việc thực hiện, tôi nghĩ rằng chỉnh sửa có thể sai. Nếu bạn đồng ý, hãy chắc chắn hoàn nguyên chỉnh sửa.
Cody Grey

1
@ k06a chỉnh sửa của bạn không chính xác . Bạn đã đặc biệt thay đổi phạm vi ban đầu thành phạm vi 2 bổ sung - đây không phải là phạm vi được chỉ định trong tiêu chuẩn C.
Antti Haapala

@CodyGray điều này đã dao động qua lại, đã tuân thủ bổ sung 1 trong 3 năm qua và OP không nói gì nên tôi đã hoàn nguyên một chỉnh sửa thay đổi thành bổ sung 2 với "phạm vi sửa lỗi", vì nó nói "bạn có thể tin cậy" , điều đó vẫn chưa chính xác.
Antti Haapala

13

Có một biến Integer trong C chiếm 2 byte hoặc 4 byte không?

Điều đó phụ thuộc vào nền tảng bạn đang sử dụng, cũng như cách trình biên dịch của bạn được cấu hình. Câu trả lời có thẩm quyền duy nhất là sử dụng sizeoftoán tử để xem số nguyên lớn như thế nào trong tình huống cụ thể của bạn.


Các yếu tố mà nó phụ thuộc vào là gì?

Phạm vi có thể được xem xét tốt nhất, thay vì kích thước . Cả hai sẽ khác nhau trong thực tế, mặc dù việc lựa chọn các loại biến theo phạm vi so với kích thước như chúng ta sẽ thấy sẽ khó hơn nhiều. Cũng cần lưu ý rằng tiêu chuẩn khuyến khích chúng ta xem xét lựa chọn các loại số nguyên dựa trên phạm vi thay vì kích thước , nhưng bây giờ chúng ta hãy bỏ qua thực tiễn tiêu chuẩn và để sự tò mò khám phá sizeof, byte và CHAR_BITvà biểu diễn số nguyên ... hãy bỏ qua lỗ thỏ và nhìn thấy nó cho chính chúng ta ...


sizeof, byte và CHAR_BIT

Tuyên bố sau đây, được lấy từ tiêu chuẩn C (được liên kết đến ở trên), mô tả điều này bằng những từ mà tôi không nghĩ có thể được cải thiện.

Các sizeofnhà điều hành mang lại kích thước (tính theo byte) của toán hạng của nó, có thể là một biểu thức hoặc tên trong ngoặc của một loại. Kích thước được xác định từ loại toán hạng.

Giả sử một sự hiểu biết rõ ràng sẽ dẫn chúng ta đến một cuộc thảo luận về byte . Người ta thường cho rằng một byte là tám bit, trong khi thực tế CHAR_BITcho bạn biết có bao nhiêu bit trong một byte . Đó chỉ là một trong những sắc thái không được xem xét khi nói về hai số nguyên byte (hoặc bốn) chung .

Chúng ta hãy kết thúc mọi thứ cho đến nay:

  • sizeof => kích thước tính theo byte và
  • CHAR_BIT => số bit theo byte

Do đó, tùy thuộc vào hệ thống của bạn, sizeof (unsigned int)có thể là bất kỳ giá trị nào lớn hơn 0 (không chỉ 2 hoặc 4), như thể CHAR_BITlà 16, sau đó một byte (mười sáu bit) có đủ bit để biểu thị số nguyên mười sáu bit được mô tả bởi tiêu chuẩn (trích dẫn dưới đây). Đó không hẳn là thông tin hữu ích, phải không? Hãy đi sâu hơn ...


Đại diện số nguyên

Tiêu chuẩn C chỉ định độ chính xác / phạm vi tối thiểu cho tất cả các loại số nguyên tiêu chuẩn (và CHAR_BIT, quá, fwiw) ở đây . Từ điều này, chúng ta có thể rút ra mức tối thiểu cho số lượng bit được yêu cầu để lưu trữ giá trị , nhưng chúng ta cũng có thể chỉ chọn các biến dựa trên phạm vi . Tuy nhiên, một phần rất lớn của chi tiết cần thiết cho câu trả lời này nằm ở đây. Ví dụ: các tiêu chuẩn sau đây unsigned intyêu cầu (ít nhất) mười sáu bit lưu trữ:

UINT_MAX                                65535 // 2¹⁶ - 1

Do đó, chúng ta có thể thấy unsigned intyêu cầu ( ít nhất ) 16 bit , đó là nơi bạn nhận được hai byte (giả sử CHAR_BITlà 8) ... và sau đó khi giới hạn đó tăng lên 2³² - 1, mọi người thay vào đó là 4 byte. Điều này giải thích các hiện tượng bạn quan sát thấy:

Hầu hết các sách giáo khoa nói rằng các biến số nguyên chiếm 2 byte. Nhưng khi tôi chạy một chương trình in các địa chỉ liên tiếp của một mảng các số nguyên thì nó cho thấy sự khác biệt của 4.

Bạn đang sử dụng một cuốn sách giáo khoa và trình biên dịch cổ xưa đang dạy cho bạn C không di động; tác giả đã viết sách giáo khoa của bạn thậm chí có thể không nhận thức được CHAR_BIT. Bạn nên nâng cấp sách giáo khoa (và trình biên dịch) và cố gắng nhớ rằng CNTT là một lĩnh vực không ngừng phát triển mà bạn cần đi trước để cạnh tranh ... Mặc dù vậy, đủ về điều đó; chúng ta hãy xem những bí mật không thể di động nào khác mà các byte nguyên nằm bên dưới lưu trữ ...

Các bit giá trị là những gì các quan niệm sai lầm phổ biến dường như được tính. Ví dụ trên sử dụng một unsignedloại số nguyên thường chỉ chứa các bit giá trị, vì vậy rất dễ bỏ lỡ ma quỷ trong chi tiết.

Ký hiệu bit ... Trong ví dụ trên tôi đã trích dẫn UINT_MAXlà giới hạn trên unsigned intvì đó là một ví dụ tầm thường để trích xuất giá trị 16từ nhận xét. Đối với các loại đã ký, để phân biệt giá trị dương và âm (đó là dấu hiệu), chúng ta cũng cần bao gồm bit dấu.

INT_MIN                                -32768 // -(2¹⁵)
INT_MAX                                +32767 // 2¹⁵ - 1

Các bit đệm ... Mặc dù không phổ biến khi gặp các máy tính có các bit đệm trong các số nguyên, tiêu chuẩn C cho phép điều đó xảy ra; một số máy (nghĩa là máy này ) triển khai các loại số nguyên lớn hơn bằng cách kết hợp hai giá trị số nguyên nhỏ hơn (đã ký) với nhau ... và khi bạn kết hợp các số nguyên đã ký, bạn sẽ nhận được một bit dấu lãng phí. Bit bị lãng phí đó được coi là phần đệm trong C. Các ví dụ khác về bit đệm có thể bao gồm bit chẵn lẻ và bit bẫy .


Như bạn có thể thấy, tiêu chuẩn dường như khuyến khích việc xem xét các phạm vi như INT_MIN.. INT_MAXcác giá trị tối thiểu / tối đa khác từ tiêu chuẩn khi chọn loại số nguyên và không khuyến khích dựa vào kích thước vì có các yếu tố tinh tế khác có thể bị lãng quên như CHAR_BITvà các bit đệm có thể ảnh hưởng đến giá trị của sizeof (int)(nghĩa là các quan niệm sai lầm phổ biến về số nguyên hai byte và bốn byte bỏ qua các chi tiết này).


13

Dự thảo tiêu chuẩn C99 N1256

http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf

Kích thước intvà tất cả các loại số nguyên khác được triển khai xác định, C99 chỉ xác định:

  • đảm bảo kích thước tối thiểu
  • kích thước tương đối giữa các loại

5.2.4.2.1 "Kích thước của các loại số nguyên <limits.h>" cung cấp các kích thước tối thiểu:

1 [...] Các giá trị được xác định theo thực hiện của chúng sẽ bằng hoặc lớn hơn về độ lớn (giá trị tuyệt đối) so với giá trị được hiển thị [...]

  • UCHAR_MAX 255 // 2 8 - 1
  • USHRT_MAX 65535 // 2 16 - 1
  • UINT_MAX 65535 // 2 16 - 1
  • ULONG_MAX 4294967295 // 2 32 - 1
  • ULLONG_MAX 18446744073709551615 // 2 64 - 1

6.2.5 "Các loại" sau đó nói:

8 Đối với hai loại số nguyên bất kỳ có cùng chữ ký và thứ hạng chuyển đổi số nguyên khác nhau (xem 6.3.1.1), phạm vi giá trị của loại có thứ hạng chuyển đổi số nguyên nhỏ hơn là một phạm vi con của các giá trị của loại khác.

và 6.3.1.1 "Boolean, ký tự và số nguyên" xác định thứ hạng chuyển đổi tương đối:

1 Mỗi loại số nguyên có thứ hạng chuyển đổi số nguyên được xác định như sau:

  • Thứ hạng của int dài dài sẽ lớn hơn thứ hạng của int dài, sẽ lớn hơn thứ hạng của int, sẽ lớn hơn thứ hạng của int ngắn, sẽ lớn hơn thứ hạng của char đã ký.
  • Thứ hạng của bất kỳ loại số nguyên không dấu nào sẽ bằng thứ hạng của loại số nguyên đã ký tương ứng, nếu có.
  • Đối với tất cả các loại số nguyên T1, T2 và T3, nếu T1 có thứ hạng lớn hơn T2 và T2 có thứ hạng lớn hơn T3, thì T1 có thứ hạng lớn hơn T3

8

Đảm bảo duy nhất là charphải rộng tối thiểu 8 bit shortintphải rộng tối thiểu 16 bit và longphải rộng tối thiểu 32 bit và sizeof (char)<= sizeof (short)<= sizeof (int)<= sizeof (long)(tương tự đúng với các phiên bản không dấu của các loại đó ).

int có thể rộng từ 16 đến 64 bit tùy theo nền tảng.


6

Là kích thước của Cv int int 2 byte hay 4 byte?

Câu trả lời là "có" / "không" / "có thể" / "có thể không".

Ngôn ngữ lập trình C chỉ định như sau: đơn vị địa chỉ nhỏ nhất, được biết đến charvà còn được gọi là "byte" , chính xác là CHAR_BITcác bit rộng, trong đó CHAR_BITít nhất là 8.

Vì vậy, một byte trong C không nhất thiết phải là octet , tức là 8 bit. Trước đây, một trong những nền tảng đầu tiên chạy mã C (và Unix) có 4 byte int- nhưng tổng cộng intcó 36 bit, vì CHAR_BITlà 9!

intđược cho là kích thước nguyên tự nhiên cho nền tảng có phạm vi ít nhất-32767 ... 32767 . Bạn có thể nhận được kích thước của intcác byte nền tảng với sizeof(int); Khi bạn nhân giá trị này với CHAR_BITbạn, bạn sẽ biết nó rộng bao nhiêu theo bit.


Mặc dù các máy 36 bit hầu hết đã chết, nhưng vẫn có các nền tảng với các byte không 8 bit. Mới hôm qua, có một câu hỏi về MCU Texas Cụ với các byte 16 bit , có trình biên dịch tuân thủ C99, C11.

Trên TMS320C28x có vẻ như char, shortinttất cả 16 bit rộng, và do đó một byte. long intlà 2 byte và long long intlà 4 byte. Cái hay của C là người ta vẫn có thể viết một chương trình hiệu quả cho một nền tảng như thế này, và thậm chí thực hiện nó theo cách di động!


"vì CHAR_BIT là 9!" - Lúc đó họ có máy tính 362880 bit!? Ấn tượng.
Josh Desmond

5

Chủ yếu là nó phụ thuộc vào nền tảng bạn đang sử dụng. Nó phụ thuộc từ trình biên dịch đến trình biên dịch. Ngày nay, trong hầu hết các trình biên dịch int4 byte . Nếu bạn muốn kiểm tra trình biên dịch của bạn đang sử dụng, bạn có thể sử dụng sizeof(int).

main()
{
    printf("%d",sizeof(int));
    printf("%d",sizeof(short));
    printf("%d",sizeof(long));
}

Điều duy nhất trình biên dịch c hứa hẹn là kích thước ngắn phải bằng hoặc nhỏ hơn int và kích thước dài phải bằng hoặc lớn hơn int. Vì vậy, nếu kích thước của int là 4, thì kích thước ngắn có thể là 2 hoặc 4 nhưng không lớn hơn Hơn thế. Trò chơi là đúng cho lâu và int. Nó cũng nói rằng kích thước của ngắn và dài không thể giống nhau.


1
Sử dụng %dcho một size_ttham số là UB.
Paul R

3

Điều này phụ thuộc vào việc triển khai, nhưng thông thường trên x86 và các kiến ​​trúc phổ biến khác như ARM intmất 4 byte. Bạn luôn có thể kiểm tra tại thời gian biên dịch bằng cách sử dụng sizeof(int)hoặc bất kỳ loại nào khác bạn muốn kiểm tra.

Nếu bạn muốn đảm bảo rằng bạn sử dụng một loại kích thước cụ thể, hãy sử dụng các loại trong <stdint.h>


2
#include <stdio.h>

int main(void) {
    printf("size of int: %d", (int)sizeof(int));
    return 0;
}

Điều này trả về 4, nhưng nó có thể phụ thuộc vào máy.


1

Là kích thước của Cv int int 2 byte hay 4 byte?

Có một biến Integer trong C chiếm 2 byte hoặc 4 byte không?

C cho phép "byte" là một cái gì đó ngoài 8 bit cho mỗi "byte".

CHAR_BIT số bit cho đối tượng nhỏ nhất không phải là trường bit (byte) C11dr §5.2.4.2.1 1

Giá trị của một cái gì đó hơn 8 ngày càng không phổ biến. Đối với tính di động tối đa, sử dụng CHAR_BITchứ không phải là 8. Kích thước của một inttrong bit trong C là sizeof(int) * CHAR_BIT.

#include <limits.h>
printf("(int) Bit size %zu\n", sizeof(int) * CHAR_BIT);

Các yếu tố mà nó phụ thuộc vào là gì?

Các intkích thước bit là thường 32 hoặc 16 bit. C phạm vi tối thiểu được chỉ định :

giá trị tối thiểu cho một đối tượng kiểu int INT_MIN-32.767
giá trị tối đa cho một đối tượng kiểu int INT_MAX32.767
C11dr §5.2.4.2.1 1

Các phạm vi tối thiểu cho intlực lượng kích thước chút để có ít nhất 16 - ngay cả khi bộ vi xử lý là "8-bit". Một kích thước như 64 bit được nhìn thấy trong các bộ xử lý chuyên dụng. Các giá trị khác như 18, 24, 36, v.v. đã xảy ra trên các nền tảng lịch sử hoặc ít nhất là về mặt lý thuyết. Mã hóa hiện đại hiếm khi lo lắng về intkích thước không phải là 2 bit.

Bộ xử lý và kiến ​​trúc của máy tính điều khiển intlựa chọn kích thước bit.

Tuy nhiên, ngay cả với bộ xử lý 64 bit, intkích thước của trình biên dịch có thể là 32 bit vì lý do tương thích vì các cơ sở mã lớn phụ thuộc vào int32 bit (hoặc 32/16).


-1

Đây là một nguồn tốt để trả lời câu hỏi này.

Nhưng câu hỏi này là một loại câu trả lời luôn luôn đúng "Có. Cả hai."

Nó phụ thuộc vào kiến ​​trúc của bạn. Nếu bạn đang làm việc trên máy 16 bit trở xuống, đó không thể là 4 byte (= 32 bit). Nếu bạn đang làm việc trên máy 32 bit hoặc tốt hơn, độ dài của nó là 32 bit.

Để tìm ra, hãy để chương trình của bạn sẵn sàng xuất ra thứ gì đó có thể đọc được và sử dụng chức năng "sizeof". Điều đó trả về kích thước tính theo byte của kiểu dữ liệu khai báo của bạn. Nhưng hãy cẩn thận khi sử dụng điều này với mảng.

Nếu bạn khai báo, int t[12];nó sẽ trả về 12 * 4 byte. Để có được chiều dài của mảng này, chỉ cần sử dụng sizeof(t)/sizeof(t[0]). Nếu bạn định xây dựng một hàm, cần tính kích thước của mảng gửi, hãy nhớ rằng nếu

typedef int array[12];
int function(array t){
    int size_of_t = sizeof(t)/sizeof(t[0]);
    return size_of_t;
}
void main(){
    array t = {1,1,1};  //remember: t= [1,1,1,0,...,0]
    int a = function(t);    //remember: sending t is just a pointer and equal to int* t
   print(a);   // output will be 1, since t will be interpreted as an int itselve. 
}

Vì vậy, điều này thậm chí sẽ không trả lại một cái gì đó khác nhau. Nếu bạn xác định một mảng và cố gắng lấy chiều dài sau đó, hãy sử dụng sizeof. Nếu bạn gửi một mảng đến một hàm, hãy nhớ giá trị gửi chỉ là một con trỏ trên phần tử đầu tiên. Nhưng trong trường hợp một, bạn luôn biết, mảng của bạn có kích thước như thế nào. Trường hợp hai có thể được tìm ra bằng cách xác định hai chức năng và bỏ lỡ một số hiệu suất. Xác định hàm (mảng t) và xác định hàm2 (mảng t, int size_of_t). Gọi "function (t)" đo độ dài bằng một số công việc sao chép và gửi kết quả đến function2, nơi bạn có thể làm bất cứ điều gì bạn muốn trên các kích thước mảng thay đổi.


Liên kết được cung cấp là một nguồn thông tin xấu vì nó giả định những điều không phải lúc nào cũng đúng (ví dụ như charluôn luôn signed)
Andrei Damian-Fekete
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.