Dalam kode saya, saya memiliki karakter typedef ini:

typedef char chessPos[2];

Dan ketika saya mencoba men-debug dan melihat nilai yang saya coba masukkan

chessPos* pos;
*pos[0] = 'C';
*pos[1] = '3’;

Setelah debugging saya mendapatkan bahwa nilai-nilai dalam array adalah seperti itu (bukan string jadi saya tidak perlu \0) untuk beberapa alasan karakter '3' tidak ada dalam array dan saya mendapatkan \0 sebagai gantinya.

debug

Apa yang bisa saya lakukan ? Terima kasih

3
Avi_M 12 Mei 2021, 12:51

2 jawaban

Jawaban Terbaik

Dalam kode Anda, Anda mendefinisikan pointer ke array char dua elemen. Itu tidak mengalokasikan memori untuk array itu. Jika Anda mereferensikan pointer ini, itu mengarah ke Perilaku Tidak Terdefinisi.

Dalam kode Anda ptr mereferensikan array char. Ketika Anda *pos[1] Anda melakukan dereferensi elemen pertama dari array char kedua bukan karakter kedua dalam array. Untuk mengakses elemen kedua dari array, Anda perlu melakukan dereferensi pointer terlebih dahulu dan kemudian menggunakan indeks (*pos)[1]

Anda perlu mengalokasikan memori untuk karakter:

#include <stdio.h>
#include <stdlib.h>

typedef char chessPos[2];

int main(void)
{
    chessPos* pos;
    pos = malloc(sizeof(*pos));
    (*pos)[0] = 'C';
    (*pos)[1] = '3';

    printf("(*pos)[0] = '%c', (*pos)[1] = '%c'\r\n", (*pos)[0],  (*pos)[1]);
}

https://godbolt.org/z/8nPxn3TxE

Atau sederhana (tanpa penunjuk)

#include <stdio.h>

typedef char chessPos[2];

int main(void)
{
    chessPos pos;
    pos[0] = 'C';
    pos[1] = '3';

    printf("pos[0] = '%c', pos[1] = '%c'\r\n", pos[0],  pos[1]);
}

https://godbolt.org/z/h6fj7c1Ea

2
0___________ 12 Mei 2021, 10:29

Anda harus menghindari menyembunyikan array dan pointer di belakang typedefs. Itu membuat kode tidak mungkin dibaca dan menyebabkan efek samping yang aneh dan tidak diinginkan.

Dalam kasus Anda chessPos* sebenarnya adalah tipe char(*)[2] dan *pos[0] memberi Anda aritmatika pointer pada tipe pointer array seperti itu, sebelum de-referensi.

Anda juga tidak dapat "menyimpan nilai di dalam pointer", itu tidak masuk akal. Pointer perlu menunjuk ke memori yang valid dan nilai yang disimpan dalam memori yang ditunjuk itu, lihat Kerusakan atau "kesalahan segmentasi" saat data disalin/dipindai/dibaca ke pointer yang tidak diinisialisasi

Jatuhkan tipe array di typedef. Jika Anda membutuhkan tipe khusus, gunakan struct sebagai gantinya:

typedef struct
{
  char coord[2];
} chessPos;

chessPos pos = { 'C', '3' };

Harap perhatikan bahwa ini juga bukan string yang diakhiri null, jadi jika Anda ingin menggunakannya, tambah ukurannya menjadi 3 dan lakukan "C3" sebagai gantinya.

3
Lundin 12 Mei 2021, 09:56