Làm thế nào để khởi tạo mảng thành 0 trong C?


170

Tôi cần một mảng null lớn trong C là toàn cầu. Có cách nào để làm điều này ngoài việc gõ ra

char ZEROARRAY[1024] = {0, 0, 0, /* ... 1021 more times... */ };

?


26
char ZEROARRAY [1024] = {0};

3
Nếu bạn cần phân bổ bộ nhớ trên heap, bạn cũng có thể sử dụng calloc (). Ví dụ: char * zeroarray = calloc (1024, sizoef (* zeroarray)); .
Andrei Ciobanu

2
NB calloc vẫn ổn char, v.v., nhưng nếu bạn muốn một mảng con trỏ, bạn nên đặt chúng rõ ràng thành NULL, không có gì đảm bảo rằng NULL được biểu diễn dưới dạng byte. Điều này mặc dù nghĩa đen 0hoàn toàn đại diện cho con trỏ null.
Adrian Ratnapala

Bản sao có thể có của Cách khởi tạo một mảng trong C
AechoLiu

Câu trả lời:


284

Biến toàn cục và biến tĩnh được tự động khởi tạo về không. Nếu bạn có

char ZEROARRAY[1024];

ở phạm vi toàn cầu, nó sẽ là tất cả các số không khi chạy. Nhưng trên thực tế có một cú pháp tốc ký nếu bạn đã có một mảng địa phương. Nếu một mảng được khởi tạo một phần, các phần tử không được khởi tạo sẽ nhận giá trị 0 của loại thích hợp. Bạn có thể viết:

char ZEROARRAY[1024] = {0};

Trình biên dịch sẽ điền vào các mục không được ghi bằng số không. Ngoài ra, bạn có thể sử dụng memsetđể khởi tạo mảng khi khởi động chương trình:

memset(ZEROARRAY, 0, 1024);

Điều đó sẽ hữu ích nếu bạn đã thay đổi nó và muốn đặt lại nó về tất cả các số không.


2
{0}; hoạt động tốt, C99 [6,7,8 / 21] Nếu có ít bộ khởi tạo trong danh sách được đóng dấu ngoặc hơn so với các phần tử hoặc thành viên của tổng hợp hoặc ít ký tự trong một chuỗi ký tự được sử dụng để khởi tạo một mảng có kích thước đã biết các phần tử trong mảng, phần còn lại của tổng hợp sẽ được khởi tạo hoàn toàn giống như các đối tượng có thời gian lưu trữ tĩnh
Sasha Zezulinsky

Vui lòng tham khảo: Số 0 khởi tạo không phải là a character. nó là một integer.
Yonggoo Noh

1
{}thảo luận: stackoverflow.com/questions/17589533/ memset không rõ ràng là đúng: Tôi nghĩ rằng nó chỉ hoạt động cho 0: stackoverflow.com/questions/11138188/
Lỗi

1
Nếu đó là một mảng các cấu trúc và sử dụng -Werror=missing-bracestrong gcc, thì nó phải được khởi tạo {{0}}. Nếu thành phần struct đầu tiên là một cấu trúc khác thì cứ {{{0}}}như vậy. Xem stackoverflow.com/questions/5434865/
Mạnh

1
Hôm nay tôi gặp phải điều kỳ lạ ... int arr[256]={1,2,7,{0}};... đã đưa tôi đến đây. Thậm chí còn không biết zeroing một phần này là một điều cho đến khi tôi nhìn thấy nó.
Neil Gatenby

32

Nếu bạn muốn khởi tạo mảng thành các giá trị khác 0, gccbạn có thể thực hiện:

int array[1024] = { [ 0 ... 1023 ] = -1 };

Đây là phần mở rộng GNU của Bộ khởi tạo được chỉ định C99 . Trong GCC cũ hơn, bạn có thể cần sử dụng -std=gnu99để biên dịch mã của mình.


14
Chỉ định khởi tạo là tiêu chuẩn trong C99. Việc sử dụng ...để biểu thị một phạm vi là một phần mở rộng dành riêng cho gcc.
Keith Thompson

1
Đó không phải là trình khởi tạo được chỉ định C99, đó là trình khởi tạo phạm vi dành riêng cho GCC . Tại sao nên tham khảo hướng dẫn sử dụng GCC thay vì tiêu chuẩn C99?
Craig Barnes
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.