Memcpy mengembalikan isi dari C array sebagai pointer [duplikat]

Aug 27 2020

Saya ingin menyalin konten array ac ke yang lain, dan saya menyadari bahwa Anda tidak bisa begitu saja melakukannya

array1 = array2;

sebagai gantinya, Anda harus menggunakan perulangan for untuk mengulang setiap indeks, atau memcpy. Saya ingin menggunakan memcpy karena orang mengatakan itu akan menghemat ruang dan saya memiliki batas 3KB untuk program saya (saya ingin memasukkannya ke dalam kode QR).

Saya memiliki fungsi di mana dalam program saya di mana saya telah mencoba untuk memanfaatkan ini, tetapi ketika saya mencetak hasil mereka keluar sebagai petunjuk. Saya sangat bingung mengapa ini terjadi, karena orang lain yang pernah saya lihat menggunakan ini ternyata baik-baik saja. Apa yang bisa saya lakukan? Fungsi saya ada di sini:

void ShiftBlock(int curBlock[4][2], int shiftCoords[2], int curGrid[WIDTH][HEIGHT])
{
     int blockCoords[4][2] = {0};
     memcpy(blockCoords, curBlock, sizeof(blockCoords));

     for(int i = 0; i < 4; i++)
     {
          blockCoords[i][0] += shiftCoords[0];
          blockCoords[i][1] += shiftCoords[1];

          if (0 > blockCoords[i][0] || blockCoords[i][0] > WIDTH || 0 > blockCoords[i][1] || blockCoords[i][1] > HEIGHT || curGrid[blockCoords[i][0]][blockCoords[i][1]] != 0)
          {
               return;
          }
     }

     memcpy(curBlock, blockCoords, sizeof(curBlock));
}

Jawaban

1 bolov Aug 27 2020 at 08:15

Array tidak bisa dilewatkan sebagai parameter, jadi untuk tipe parameter, dimensi pertama dari tipe array selalu diabaikan dan deklarasi parameter adalah pointer. Jadi jenis fungsi Anda sebenarnya:

void ShiftBlock(int (*curBlock)[2], int* shiftCoords, int (*curGrid)[HEIGHT])

Saya merekomendasikan untuk menggunakan formulir ini karena formulir lainnya menyesatkan.

Sekarang Anda dapat melihat bahwa sizeof(curBlock)itu salah. Ini hanya seukuran sebuah pointer. Jadi gunakan sizeof(blockCoords)atau sizeof(int[4][2])atau 4 * sizeof(*curBlock).