Bagaimana cara memperbaiki penentu deklarasi yang diharapkan realoc atau kesalahan '...' sebelum 'sizeof'?

Aug 15 2020

Saya mendapatkan kesalahan berikut di bawah ini setelah menelepon realloc

void* realloc(sizeof(char)100);

Kesalahan:

linex.c: 23: 16: error: penentu deklarasi yang diharapkan atau '...' sebelum 'sizeof'

Tolong bantu. Terima kasih. :)

Jawaban

1 RobertSsupportsMonicaCellio Aug 15 2020 at 15:42
void realloc(sizeof(char)100);

Asumsikan yang Anda maksud adalah panggilan ke realloc()fungsi standar (bukan deklarasi kustom realloc()) dan Anda ingin mengubah ukuran memori, kode ini salah terkait tiga poin.

1.

realloc() membutuhkan pointer ke memori yang dialokasikan oleh manajemen memori dan belum dibebaskan sebagai argumen pertama.

Ini adalah prototipe / deklarasi untuk realloc()fungsi standar :

void *realloc( void *ptr, size_t new_size );

realloc()Panggilan Anda menghilangkan argumen penunjuk ini.

2.

Jangan tentukan jenis pengembalian (di sini void *) saat Anda ingin memanggil fungsi. Dengan ini Anda mencoba membuat deklarasi baru dari fungsi tersebut realloc()dan bukan panggilan.

Jika Anda mencoba melakukan beberapa casting di sini, ini juga salah. Untuk cast implisit, Anda perlu mengapit tipe yang akan di-cast dengan tanda kurung seperti (void *).

Perhatikan bahwa dalam kedua kasus, pemerannya berlebihan. Dengan melihat para pemeran tipe pengembalian, lihatlah:

  • Apakah saya memberikan hasil malloc?

3.

Pada argumen ukuran, Anda membutuhkan *operator antara sizeof(char)dan 100.


Menggunakan:

realloc( ptr, sizeof(char) * 100 );

Perhatikan bahwa Anda juga harus selalu memeriksa nilai kembali fungsi manajemen memori apakah terjadi kesalahan atau tidak:

char * ptr2 = realloc( ptr1, sizeof(char) * 100);
if ( ptr2 == NULL )
{
    fputs("Error at resizing the allocated memory!\n", stderr);
    // error routine.
}

Hal yang sama harus selalu Anda lakukan untuk malloc():

char * ptr1 = malloc( sizeof(char) * 50);
if ( ptr1 == NULL )
{
    fputs("Error at memory allocation!\n", stderr);
    // error routine.
}

Pelajaran lanjutan (Anda tidak perlu memahaminya pada saat ini):

Perhatikan bahwa dalam kasus realloc(), saya menggunakan penunjuk yang berbeda untuk menangkap nilai yang dikembalikan realloc().

Ini karena realloc()mungkin atau mungkin tidak mengembalikan penunjuk yang sama diteruskan sebagai argumen.

Praktik yang sayangnya umum tetapi buruk adalah menetapkan kembali pointer yang diteruskan sebagai argumen pertama dengan nilai yang dikembalikan realloc().

Ini berbahaya karena referensi ke memori yang dialokasikan terlebih dahulu kemudian bisa hilang jika realloc()dialokasikan memori "pengganti" lain tetapi tidak dihapus terlebih dahulu.

Terkait:

  • Apakah praktik pengkodean yang baik untuk menetapkan alamat yang dikembalikan oleh realloc () ke penunjuk yang sama?
  • https://stackoverflow.com/a/25435175/12139179
  • Bagaimana realloc () mengalokasikan kembali memori?
1 EricPostpischil Aug 15 2020 at 17:35

void* realloc(sizeof(char)*100); adalah kesalahan mendeklarasikan sebuah fungsi dan memanggilnya.

Ketika kita mendeklarasikan sebuah fungsi, kita mengatakan apa jenis kembaliannya dan jenis parameternya, seperti pada void *realloc(void *, size_t);. Kami juga dapat memberikan nama placeholder untuk parameter sebagai deskripsi yang berguna, seperti pada void *realloc(void *pointer, size_t size);. (Nama parameter diperlukan saat mendefinisikan fungsi sepenuhnya.)

Ketika kita memanggil suatu fungsi, kita tidak memberikan nama tipe untuk nilai yang dikembalikan atau parameternya. Kami hanya memberikan ekspresi yang memberikan nilai argumen, seperti pada NewPointer = realloc(OldPointer, 100 * sizeof *NewPointer);.

Kadang-kadang nama tipe mungkin muncul di dalam atau di dekat panggilan ke suatu fungsi, tetapi ini bersifat insidental dan bukan bagian langsung dari panggilan fungsi. Contohnya adalah:

  • char *NewPointer = realloc(OldPointer, 100 * sizeof *NewPointer);: Kode ini memiliki char *karena mendeklarasikan dan mendefinisikan NewPointer. Kemudian NewPointerdiinisialisasi dengan reallocpanggilan.
  • NewPointer = (char *) realloc(OldPointer, 100 * sizeof *NewPointer);: Kode ini memiliki (char *)peran untuk mengubah nilai kembali reallocke tipe penunjuk tertentu. Ini tidak diperlukan di C.
  • NewPointer = realloc(OldPointer, 100 * sizeof(char));: Kode ini memiliki char *operand sizeofuntuk menghitung space yang dibutuhkan. Ini tidak perlu karena ukurannya bisa diambil dengan sizeof *NewPointer, dan itu umumnya lebih disukai karena secara otomatis menyesuaikan dengan perubahan dalam deklarasi NewPointer, mengurangi kemungkinan bug mungkin diperkenalkan dengan mengubah tipe dalam deklarasi NewPointertapi mengabaikan sizeofekspresi.