Làm thế nào để trình biên dịch điền giá trị trong char array[100] = {0};
? Điều kỳ diệu đằng sau nó là gì?
Tôi muốn biết làm thế nào trình biên dịch nội bộ khởi tạo.
Làm thế nào để trình biên dịch điền giá trị trong char array[100] = {0};
? Điều kỳ diệu đằng sau nó là gì?
Tôi muốn biết làm thế nào trình biên dịch nội bộ khởi tạo.
Câu trả lời:
Đó không phải là phép thuật.
Hành vi của mã này trong C được mô tả trong phần 6.7.8.21 của đặc tả C ( bản nháp trực tuyến của thông số C ): đối với các phần tử không có giá trị được chỉ định, trình biên dịch khởi tạo con trỏ thành NULL và các loại số học về 0 ( và áp dụng đệ quy này cho tổng hợp).
Hành vi của mã này trong C ++ được mô tả trong phần 8.5.1.7 của đặc tả C ++ ( bản nháp trực tuyến của thông số C ++ ): trình biên dịch tổng hợp khởi tạo các phần tử không có giá trị được chỉ định.
Ngoài ra, lưu ý rằng trong C ++ (chứ không phải C), bạn có thể sử dụng danh sách trình khởi tạo trống, khiến trình biên dịch tổng hợp khởi tạo tất cả các phần tử của mảng:
char array[100] = {};
Đối với loại mã nào trình biên dịch có thể tạo khi bạn thực hiện việc này, hãy xem câu hỏi này: Tập hợp lạ từ khởi tạo mảng 0
Việc thực hiện là tùy thuộc vào các nhà phát triển trình biên dịch.
Nếu câu hỏi của bạn là "điều gì sẽ xảy ra với khai báo như vậy" - trình biên dịch sẽ đặt phần tử mảng đầu tiên thành giá trị bạn đã cung cấp (0) và tất cả các phần tử khác sẽ được đặt thành 0 vì đó là giá trị mặc định cho các phần tử mảng bị bỏ qua.
Nếu trình biên dịch của bạn là GCC, bạn cũng có thể sử dụng cú pháp sau:
int array[256] = {[0 ... 255] = 0};
Vui lòng xem http://gcc.gnu.org/onlinesocs/gcc-4.1.2/gcc/Designated-Inits.html#Designated-Inits và lưu ý rằng đây là một tính năng dành riêng cho trình biên dịch .
Nó phụ thuộc vào nơi bạn đặt khởi tạo này.
Nếu mảng tĩnh như trong
char array[100] = {0};
int main(void)
{
...
}
sau đó nó là trình biên dịch dự trữ 100 0 byte trong phần tách dữ liệu của chương trình. Trong trường hợp này, bạn có thể đã bỏ qua trình khởi tạo.
Nếu mảng của bạn là tự động, thì đó là một câu chuyện khác.
int foo(void)
{
char array[100] = {0};
...
}
Trong trường hợp này tại mỗi cuộc gọi của hàm foo, bạn sẽ có một bộ nhớ ẩn.
Mã ở trên tương đương với
int foo(void)
{
char array[100];
memset(array, 0, sizeof(array));
....
}
và nếu bạn bỏ qua trình khởi tạo, mảng của bạn sẽ chứa dữ liệu ngẫu nhiên (dữ liệu của ngăn xếp).
Nếu mảng cục bộ của bạn được khai báo tĩnh như trong
int foo(void)
{
static char array[100] = {0};
...
}
sau đó về mặt kỹ thuật là trường hợp tương tự như trường hợp đầu tiên.