2011-10-11 36 views

Trả lời

10

Từ tiêu chuẩn C:

5.2.4.1 giới hạn dịch

1 Việc thực hiện sẽ có thể dịch và thực hiện ít nhất một chương trình có chứa ít nhất một thể hiện của mỗi người của số giới hạn sau:

... - 65535 byte trong một đối tượng (chỉ trong môi trường được lưu trữ)
... - 1023 thành viên trong một cấu trúc đơn hoặc công đoàn
... - 63 mức độ cấu trúc lồng nhau hoặc định nghĩa công đoàn trong một đơn struct-khai-list ... 13) Triển khai nên tránh áp đặt cố định giới hạn dịch bất cứ khi nào có thể.

Ngoài ra, giới hạn trên là SIZE_MAX (giá trị lớn nhất cho size_t).

5

Vì toán tử sizeof mang lại kết quả là loại size_t, giới hạn phải là SIZE_MAX.

Bạn có thể xác định giá trị của SIZE_MAX như thế này:

#include <stdint.h> 
#include <stdio.h> 

int main (void) { 
    printf("%zu", SIZE_MAX); 
    return 0; 
} 

Đây là những gì các trình biên dịch nên cho phép. Môi trường thời gian chạy cho phép là một câu chuyện khác.

Khai báo một đối tượng có kích thước tương tự trên ngăn xếp (cục bộ) trong thực tế sẽ không hoạt động vì ngăn xếp có thể nhiều, nhỏ hơn nhiều so với SIZE_MAX.

Có một đối tượng như vậy trên toàn cầu có thể khiến trình tải thực thi bị khiếu nại khi khởi động chương trình.

+0

Bạn có thể cho biết giá trị có thể xảy ra của SIZE_MAX không? là nó phụ thuộc vào hệ điều hành? tôi muốn biết giá trị chính xác. – Nemo

+0

Tôi thực sự tò mò về kích thước bạn muốn sử dụng và lý do tại sao. Nói với chúng tôi? – Joe

+1

Ít nhất là về lý thuyết. Trong thực tế, giới hạn là bộ nhớ trong máy tính, nhỏ hơn nhiều so với 'SIZE_MAX' trên máy tính 64-bit hiện đại. –

0

phân tích thực nghiệm

Trên thực tế, implentations như GCC dường như chỉ cho phép cấu trúc nhỏ hơn size_t, có lẽ bị ràng buộc bởi PTRDIFF_MAX. Xem thêm: What is the maximum size of an array in C?

Sử dụng:

for i in `seq 32`; do printf "typedef struct { S$i x; S$i y; } S$(($i+1));\n"; done 

Chúng tôi làm cho chương trình:

#include <stdint.h> 
#include <stdio.h> 

typedef struct { uint8_t i; } S0; 
typedef struct { S0 x; S0 y; } S1; 
typedef struct { S1 x; S1 y; } S2; 
typedef struct { S2 x; S2 y; } S3; 
typedef struct { S3 x; S3 y; } S4; 
typedef struct { S4 x; S4 y; } S5; 
typedef struct { S5 x; S5 y; } S6; 
typedef struct { S6 x; S6 y; } S7; 
typedef struct { S7 x; S7 y; } S8; 
typedef struct { S8 x; S8 y; } S9; 
typedef struct { S9 x; S9 y; } S10; 
typedef struct { S10 x; S10 y; } S11; 
typedef struct { S11 x; S11 y; } S12; 
typedef struct { S12 x; S12 y; } S13; 
typedef struct { S13 x; S13 y; } S14; 
typedef struct { S14 x; S14 y; } S15; 
typedef struct { S15 x; S15 y; } S16; 
typedef struct { S16 x; S16 y; } S17; 
typedef struct { S17 x; S17 y; } S18; 
typedef struct { S18 x; S18 y; } S19; 
typedef struct { S19 x; S19 y; } S20; 
typedef struct { S20 x; S20 y; } S21; 
typedef struct { S21 x; S21 y; } S22; 
typedef struct { S22 x; S22 y; } S23; 
typedef struct { S23 x; S23 y; } S24; 
typedef struct { S24 x; S24 y; } S25; 
typedef struct { S25 x; S25 y; } S26; 
typedef struct { S26 x; S26 y; } S27; 
typedef struct { S27 x; S27 y; } S28; 
typedef struct { S28 x; S28 y; } S29; 
typedef struct { S29 x; S29 y; } S30; 
/*typedef struct { S30 x; S30 y; } S31;*/ 
S30 s; 

int main(void) { 
    printf("%jx\n", (uintmax_t)sizeof(s)); 
    return 0; 
} 

và sau đó trong Ubunbu 17.10:

$ arm-linux-gnueabi-gcc --version 
arm-linux-gnueabi-gcc (Ubuntu/Linaro 7.2.0-6ubuntu1) 7.2.0 
Copyright (C) 2017 Free Software Foundation, Inc. 
This is free software; see the source for copying conditions. There is NO 
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 

$ arm-linux-gnueabi-gcc -std=c99 main.c 

công trình. Nhưng nếu chúng ta bỏ ghi chú S31, nó không thành công với:

main.c:35:16: error: type ‘struct <anonymous>’ is too large 
typedef struct { S30 x; S30 y; } S31; 

Vì vậy, kích thước tối đa là giữa 2^30 và (2^31-1).

Sau đó, chúng ta có thể chuyển đổi S30 tới:

typedef struct { S29 x; S29 y; uint8_t a[(2lu << 29) - 1]; } S30; 

và với điều đó chúng tôi xác định rằng kích thước tối đa là thực sự 2^31 - 1 == PTRDIFF_MAX thi này.

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