2011-11-23 30 views
5

Tôi biết rằng trong C, mảng không được cho là có kích thước động.Có thể sử dụng sizeof() để xác định chiều dài mảng không?

Với ý nghĩ đó, mã sau có được phép không? (Đang cố gắng để khai báo một mảng các ký tự cùng độ dài như là một đôi.)

char bytes[sizeof(double)]; 

tôi đoán là sizeof hoạt động trên đối số của nó trong quá trình thực hiện chương trình và vì vậy đây sẽ không được phép, nhưng tôi không chắc chắn .

Ngoài ra, sẽ có sự khác biệt nếu đây là C++ thay vì C?

Trả lời

7

Biểu thức sizeof được đánh giá tại thời gian biên dịch (bởi trình biên dịch không phải là bộ tiền xử lý) để biểu thức là hợp pháp.

Có ngoại lệ đối với quy tắc này trong C99 khi cho phép mảng động. Trong trường hợp đó sizeof là, tùy thuộc vào ngữ cảnh, được đánh giá ở thời gian chạy (http://en.wikipedia.org/wiki/Sizeof). Nó không thay đổi tính hợp pháp của biểu thức trong câu hỏi.

1

Có, nó hoàn toàn tốt để làm điều đó. sizeof() 's giá trị được xác định tại thời gian biên dịch.

6

Có, nó có thể và thậm chí nó sẽ không được kích thước động, vì sizeof(double) là hằng số biên dịch.

1

Cung cấp toán hạng của nó không phải là VLA, bạn có thể sử dụng sizeof làm contant thực.

#include <stdio.h> 
#include <string.h> 

int main(void) { 
    double x; 
    unsigned char dbl[sizeof x];        /* real constant */ 

    /* make x's format have a 1 bit on the "correct" place */ 
    x = 32.000000000000004; 
    memcpy(dbl, &x, sizeof x); 
    switch (dbl[0]) { 
    case sizeof *dbl: puts("1"); break;     /* real constant */ 
    case 0: puts("0"); break; 
    default: puts("other"); 
    } 
    return 0; 
} 

đang Xem "chạy" tại http://ideone.com/95bwM

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