2010-09-15 35 views
11

Tôi muốn khởi tạo mảng hai chiều có kích thước biến bằng không. Tôi biết nó có thể được thực hiện cho một mảng kích thước cố định:khởi tạo mảng C đa chiều có kích thước biến thành số không

int myarray[10][10] = {0}; 

nhưng nó không làm việc nếu tôi làm điều này:

int i = 10; 
int j = 10; 
int myarray[i][j] = {0}; 

Có cách nào một dòng để làm điều này hay làm Tôi phải lặp qua từng thành viên của mảng?

Cảm ơn

Trả lời

9

Bạn không thể khởi tạo nó với một initializer, nhưng bạn có thể memset() mảng đến 0.

#include <string.h> 

int main(void) { 
    int a = 13, b = 42; 
    int m[a][b]; 
    memset(m, 0, sizeof m); 
    return 0; 
} 

Lưu ý: đây là C99. Trong C89 việc khai báo m (int m[a][b];) là một lỗi.

+0

@ vittorio88: có thể bạn đang sử dụng trình biên dịch C++. Trong C một con trỏ tới bất kỳ đối tượng nào ('m' một mình, kiểu' int (*) [b] ') tương thích với một con trỏ để void (gõ' void * ') là' memset() 'mong đợi. Vì vậy, không có vấn đề ở đó. – pmg

-1

Biến kích thước mảng hai chiều không được hỗ trợ trong C. Một thứ nguyên (tôi không thể nhớ nếu nó là lần đầu tiên hoặc thứ hai) phải được cố định. Tôi khuyên bạn nên lặp lại nó sau khi nó được xác định.

+0

-0,5 (làm tròn) 'C99' hỗ trợ mảng hai chiều có kích thước biến. – pmg

+0

Bạn nói đúng. lỗi của tôi. – erelender

1

Nếu bạn có con trỏ đến cấu trúc dữ liệu của mình, bạn có thể thử memset.

+0

+1 - memset là cách tốt nhất để khởi tạo các mảng và phân bổ bộ nhớ mới, nó chắc chắn hoạt động trong C++, đáng để thử trong C. – ChrisBD

+0

@kbrimington: Trong hầu hết các ngữ cảnh, một tên mảng là "phân rã" thành con trỏ yếu tố đầu tiên của nó. Điều đó cũng làm việc cho các mảng đa chiều và, như memset() lấy một 'void *', không có vấn đề gì về kiểu con trỏ mà tên mảng của nó đại diện cho nó. – pmg

+0

@pmg - Cảm ơn. Tôi hiểu điều này; tuy nhiên, tôi đánh giá cao việc làm rõ. – kbrimington

0

Bạn không thể tạo một mảng tĩnh sử dụng các biến không liên tục. Hãy thử sử dụng phân bổ động:

int i = 10; 
int j = 10; 
size_t nbytes = i*j*sizeof(int); 
int* myarray = (int*) malloc(nbytes); 
memset(myarray,0,nbytes); 
+0

-0,5 (được làm tròn) trong 'C99' bạn ** DO ** có thể tạo các mảng tĩnh sử dụng các biến không liên tục. – pmg

3

Online C99 Standard (n1256 draft), mục 6.7.8, para 3:

Các loại thực thể được khởi tạo sẽ là một mảng kích thước không biết hoặc một loại đối tượng là không phải là loại mảng có độ dài thay đổi.

Mỏ nhấn mạnh.

Như mọi người khác đã nói, đặt cược tốt nhất của bạn là sử dụng memset().

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