Mã C thích này:Tại sao mã C này có thể chạy đúng?
#include <stdio.h>
#include <unistd.h>
#define DIM(a) (sizeof(a)/sizeof(a[0]))
struct obj
{
int a[1];
};
int main()
{
struct obj *p = NULL;
printf("%d\n",DIM(p->a));
return 0;
}
con trỏ đối tượng này p
là NULL
, vì vậy, tôi nghĩ rằng p->a
này là bất hợp pháp. Nhưng tôi đã thử nghiệm mã này trong Ubuntu14.04, nó có thể thực thi chính xác. Vì vậy, tôi muốn biết tại sao ...
Lưu ý: mã gốc có int a[0]
trên nhưng tôi đã thay đổi đó để int a[1]
kể từ khi tất cả mọi người dường như được treo lên trên đó chứ không phải là thực tế câu hỏi , đó là:
Biểu thức sizeof(p->a)
hợp lệ khi p
bằng NULL
?
Không phải những gì đang xảy ra ở đây, nhưng đừng cho rằng những thứ "bất hợp pháp" (hành vi không xác định) dường như không hoạt động. Họ có thể, trên thực tế, xuất hiện để làm việc trong một thời gian rất dài trước khi một cái gì đó đơn giản như một phiên bản trình biên dịch nâng cấp phá vỡ chúng. – chris
Tiêu đề cho biết C, câu đầu tiên cho biết C, các tiêu đề là C tiêu đề, bạn đã sử dụng 'printf' hơn là' cout', thậm chí không có một chút mã C++ trong câu hỏi, vì vậy tôi đang ở mất tổng cộng là tại sao nó được gắn thẻ C * và * C++ :-) Tuy nhiên, đó là một câu hỏi hay. – paxdiablo
Chris Beck hoàn toàn chính xác: macro '#define DIM()' của bạn là * thời gian biên dịch *. Nó chỉ là * loại * quan trọng ở đây: không phải là giá trị thời gian chạy thực tế. – paulsm4