Mengapa saya mendapatkan kesalahan segmentasi dalam kode saya?

Ketika saya mengkompilasi kode saya dengan GCC dan kemudian saya menjalankannya, ketika saya memanggil fungsi saya ke dalam kode saya, ia mencetak: "Kesalahan segmentasi (core dumped)".

Saya mencoba mencari solusi di google.

Ini kode saya saat ini:

char ** saveLevelPositions() {
  int x, y;
  char ** positions;
  positions = malloc(sizeof(char *) * 25);

  for (y = 0; y < 25; y++) {
    positions[y] = malloc(sizeof(char) * 100);

    for (x = 0; x < 100; x++) {
      positions[x][y] = mvinch(y, x);
    }
  }

  return positions;
}

Saya berharap fungsinya berjalan dengan baik dan hanya memberikan kesalahan segmentasi.

EDIT: Untuk sedikit konteks, berikut ini tautan ke proyek GitHub: https://github.com/xslendix/rogue


person xSlendiX Gaming    schedule 05.04.2019    source sumber
comment
Sayangnya itu bukan solusi yang valid, saya mencobanya dan mendapatkan masalah yang sama.   -  person xSlendiX Gaming    schedule 05.04.2019
comment
Ini jelas merupakan bagian yang valid dari sebuah solusi. Jika masih ada masalah, bukankah itu ada pada kode yang diposting (mvinch)?.   -  person Eugene Sh.    schedule 05.04.2019
comment
Masih dengan masalah yang sama...   -  person xSlendiX Gaming    schedule 05.04.2019
comment
@EugeneSh. mvinch adalah fungsi bawaan dari kutukan.h   -  person xSlendiX Gaming    schedule 05.04.2019
comment
Lihat Cara membuat contoh Minimal, Lengkap, dan Dapat Diverifikasi. Debugger juga mungkin bisa membantu.   -  person sjsam    schedule 05.04.2019
comment
Dalam kode Anda di github saya melihat Room ** rooms; rooms = malloc(sizeof(Room) * 2); - ini pasti salah. Mengapa rooms merupakan penunjuk ganda? Saya belum melihat lebih jauh, tapi saya berasumsi mungkin ada masalah lain.   -  person Eugene Sh.    schedule 05.04.2019


Jawaban (1)


Seperti yang ditunjukkan oleh jawaban dan komentar lain, Anda harus menukar penggunaan x dan y, jadi
positions[x][y] seharusnya positions[y][x].

Selain itu, Anda tidak menggunakan tipe yang benar untuk menyimpan hasil mvinch. Dalam curses.h dikatakan:

typedef unsigned long chtype;

jadi Anda harus mengalokasikan memori sebagai berikut:

chtype ** positions;
positions = malloc(sizeof(chtype *) * 25);
positions[y] = malloc(sizeof(chtype) * 100);

Dan aktifkan peringatan kompiler Anda, karena kompiler seharusnya menandai kesalahan ini.

person Paul Ogilvie    schedule 05.04.2019