Menginisialisasi array 2d tanpa menentukan ukuran

Saya dapat menginisialisasi array satu dimensi di c dengan atau tanpa menginisialisasi ukurannya:

int x[] = {1,2,3,4,5};
int y[5] = {1,2,3,4,5};

Tapi, ketika saya mencoba melakukan hal yang sama untuk array dua dimensi seperti

int x[][] = {{1,2,3},
             {4,5,6}};

Saya mendapatkan error: array type has incomplete element type. Kesalahan yang sama terjadi jika saya mendeklarasikan dan menginisialisasi array pada baris yang berbeda. Namun, saya dapat menginisialisasinya sambil menyatakan ukurannya:

int x[2][3] = {{1,2,3},
               {4,5,6}};

Tidak ada kesalahan dengan yang satu ini. Pertanyaan saya adalah, apakah mungkin menginisialisasi array multi dimensi tanpa menginisialisasi ukurannya terlebih dahulu? Saya menanyakan hal ini karena untuk proyek akhir, saya harus dapat mendeklarasikan array dan menginisialisasinya nanti, dan ukurannya tidak akan diketahui saat kompilasi.


person Daniel    schedule 23.09.2017    source sumber
comment
Jika memiliki ukuran dinamis, bagaimana Anda memberikan daftar penginisialisasi dalam kode?   -  person Barmar    schedule 23.09.2017
comment
Apa yang Anda maksud dengan mendeklarasikan dan menginisialisasi array pada baris yang berbeda? Satu-satunya cara untuk menginisialisasi array adalah dengan mendeklarasikannya.   -  person Barmar    schedule 23.09.2017
comment
@Barmar, salahku, kurasa aku bermaksud mengatakan definisi. Seperti pada has int x[][]; lalu di tempat lain ketik x[][] =...   -  person Daniel    schedule 23.09.2017
comment
@Barmar Mengenai ukuran dinamis, itu adalah cara saya mengatakannya dengan buruk. Yang saya maksud adalah ukuran array tidak akan diketahui saat kompilasi.   -  person Daniel    schedule 23.09.2017
comment
Untuk memperluas apa yang @barmer tulis: ANDA hanya dapat menginisialisasi variabel dengan deklarasinya. Yang menjadikan ini sebuah definisi (bukan satu-satunya cara untuk sebuah definisi, tetapi yang pasti). Dan jika ukurannya tidak diketahui pada waktu kompilasi, Anda tidak dapat menginisialisasinya pada waktu kompilasi (kedengarannya masuk akal bagi saya). Mungkin Anda ingin melakukan riset di buku C Anda tentang deklarasi, definisi, dan inisialisasi.   -  person too honest for this site    schedule 23.09.2017
comment
Pelajari tentang VLA, tersedia sejak C99 (namun dijadikan opsional di C11; masih tersedia secara luas).   -  person ad absurdum    schedule 23.09.2017
comment
Jika Anda mengetahui daftar nilai yang akan diinisialisasi, seperti pada upaya inisialisasi int[x][y], lalu bagaimana Anda tidak mengetahui ukurannya? Membiarkan ukuran kosong hanyalah sebuah kenyamanan di baris kode pertama -- kompiler menghitung inisialisasi alih-alih memaksa Anda melakukannya. Tapi itu masih diketahui pada waktu kompilasi.   -  person Barmar    schedule 24.09.2017
comment
Jika Anda tidak mengetahui ukuran dan nilai awal hingga run time, maka Anda jelas tidak dapat menginisialisasinya dengan literal seperti itu. Gunakan VLA atau alokasi dinamis dengan malloc().   -  person Barmar    schedule 24.09.2017
comment
@Comrade_Comski Terlepas dari bagaimana Anda mendeklarasikannya, Anda tidak pernah dapat menetapkan ke sebuah array, Anda hanya dapat menetapkan ke elemen individual.   -  person Barmar    schedule 24.09.2017


Jawaban (3)


apakah mungkin untuk menginisialisasi array multi dimensi tanpa terlebih dahulu menginisialisasi ukurannya?

Tidak, tidak dengan cara yang Anda usulkan atau semacamnya.

Saya harus dapat mendeklarasikan array dan menginisialisasinya nanti, dan array tersebut akan memiliki ukuran dinamis.

Jika ukurannya tidak diketahui pada waktu kompilasi, Anda harus mengalokasikan array menggunakan a = malloc(x * y * sizeof(value_t)). Kemudian indeks ke dalamnya seperti a[i + j*y].

person John Zwinck    schedule 23.09.2017
comment
Bukankah array dengan panjang variabel juga suatu kemungkinan? - person Barmar; 23.09.2017
comment
Perhatikan bahwa Anda harus memeriksa perkalian x*y*sizeof(value_t) untuk integer overflow. - person ndim; 23.09.2017
comment
VLA tidak memerlukan alokasi dinamis. Jika ingin menggunakannya, Anda masih bisa menggunakan VLA. Menggunakan array 1D dan menghitung indeks secara manual bukanlah array 2D, rawan kesalahan dan ketinggalan jaman sejak 18 tahun. - person too honest for this site; 23.09.2017

Is it possible to initialize a multi dimensional array without first initializing its size?

=> Tidak, itu tidak mungkin.

Hal yang mungkin adalah Anda mengambil ukuran array dan kemudian mengalokasikan memori menggunakan calloc. Saya meminta Anda untuk menggunakan calloc karena dengan cara ini semua elemen array pada awalnya akan diinisialisasi sebagai 0.

Sekarang, penggunaan calloc akan diterapkan sebagai:

Dengan asumsi Anda menginginkan array 2D, maka Anda mengambil variabel baris dan kolom sebagai masukan dari pengguna. Kemudian gunakan,

int *x;
x = calloc( ( row * column), sizeof(datatype) );

Dalam hal ini tipe datanya adalah int.

Secara singkat kode akan muncul sebagai:

int row, column, *x;

    /* TAKING INPUT FROM THE USER */
printf("\n\t Enter the number of rows : ");
scanf("%d", &row);
printf("\n\t Enter the number of columns : ");
scanf("%d", &column);

    /* DYNAMICALLY ALLOCATING MEMORY TO x USING calloc */
x = calloc( (row * column), sizeof(int));

Saya harap kode ini menyelesaikan masalah Anda.

Ada satu hal lagi yang ingin aku bagikan kepadamu.

Di baris kode Anda ini:

int x[][] = {{1,2,3},
             {4,5,6}};

Inisialisasi ini hanya melewatkan satu hal dan hal itu menyebutkan ukuran kolom dan jika tidak, kodenya benar.

Jadi, Koreksi kode Anda:

int x[][3] = {{1,2,3},
             {4,5,6}};

Ini akan bekerja dengan baik.

Tetap mencoba! Hal-hal seperti ini hanya bisa diketahui saat berlatih.

Selamat Mengkode!

person Jorvis    schedule 24.09.2017

Ya, tapi Anda melewatkan satu koma:

int x[2][3] = {{1,2,3},
               {4,5,6}};

Semua elemen array (bahkan array dalam) harus dipisahkan dengan koma

person ACVM    schedule 23.09.2017
comment
Bukankah itu menyebabkan kesalahan sintaksis, bukan array memiliki tipe yang tidak lengkap? - person Barmar; 23.09.2017
comment
Yang saya tahu adalah dia mengalami kesalahan sintaksis... stackoverflow.com/questions/15520880/ - person ACVM; 23.09.2017
comment
Dia juga memiliki kesalahan sintaksis dalam versi yang menurutnya berfungsi. Saya pikir dia salah menyalinnya ke dalam pertanyaan. - person Barmar; 23.09.2017
comment
Pertanyaannya adalah bagaimana melakukannya tanpa memasukkan [2][3] ke dalam ukurannya. - person Barmar; 23.09.2017
comment
Ahh aku melihatnya sekarang, salahku. - person ACVM; 23.09.2017