😈
ReverseMe
  • Introduction
  • References
  • ReverseMe
    • Introduction
      • What is Reverse Engineering?
      • Legality of Reverse Engineering
      • Reverse Engineering Communities
  • Programming Language
    • C
      • Basic
        • Pointer
        • Casting
      • Reference
        • stdio.h
          • fclose()
          • fopen()
          • fseek()
          • ftell()
          • fgetc()
          • fgets()
          • fread()
          • fprintf()
          • fwrite()
          • printf()
          • putchar()
          • puts()
          • sprintf()
          • snprintf()
        • stdlib.h
          • malloc()
          • calloc()
          • realloc()
          • free()
          • rand()
          • srand()
        • string.h
          • strcat()
          • strncat()
          • strcmp()
          • strncmp()
          • strcpy()
          • strncpy()
        • time.h
          • time()
  • Reversing Fundamentals
    • Stripped and Unstripped
  • Tools
    • file
    • strings
    • ltrace
    • ghidra
  • CTF Writeups
    • HackTheBox Challenges
      • Baby RE
      • You Cant C Me
  • ABOUT ME
    • Mail
    • LinkedIn
    • GitHub
Powered by GitBook
On this page
  • Sintaks
  • Contoh Penggunaan
  • 1. Menambah ukuran array dinamis
  • 2. Mengurangi ukuran blok memori
  • 3. Penanganan jika realloc() gagal
  1. Programming Language
  2. C
  3. Reference
  4. stdlib.h

realloc()

Mengubah ukuran memori yang sudah dialokasikan dalam C

Fungsi realloc() digunakan untuk mengubah ukuran blok memori yang telah dialokasikan sebelumnya dengan malloc() atau calloc().

Jika ukuran baru lebih besar, maka blok baru bisa dialokasikan, dan data lama tetap dipertahankan.

Sintaks

void *realloc(void *ptr, size_t new_size);
  • ptr âžœ Pointer ke blok memori yang sebelumnya dialokasikan dengan malloc() atau calloc().

  • new_size âžœ Ukuran baru (dalam byte) yang ingin dialokasikan.

  • Mengembalikan pointer ke blok memori yang telah diperbesar/diperkecil.

  • Jika gagal, mengembalikan NULL, tetapi memori lama tetap ada.

Contoh Penggunaan

1. Menambah ukuran array dinamis

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

int main() {
    int *arr;
    int n = 3;

    // Alokasi awal untuk 3 elemen
    arr = (int*) malloc(n * sizeof(int));

    if (arr == NULL) {
        printf("Alokasi awal gagal!\n");
        return 1;
    }

    // Mengisi nilai awal
    for (int i = 0; i < n; i++) {
        arr[i] = i + 1;
    }

    // Menampilkan array sebelum realloc
    printf("Array sebelum realloc: ");
    for (int i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");

    // Menambah ukuran array menjadi 5 elemen
    n = 5;
    arr = (int*) realloc(arr, n * sizeof(int));

    if (arr == NULL) {
        printf("realloc gagal!\n");
        return 1;
    }

    // Mengisi elemen tambahan
    for (int i = 3; i < n; i++) {
        arr[i] = i + 1;
    }

    // Menampilkan array setelah realloc
    printf("Array setelah realloc: ");
    for (int i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");

    free(arr); // Bebaskan memori
    return 0;
}

Hasilnya:

Array sebelum realloc: 1 2 3
Array setelah realloc: 1 2 3 4 5
  • malloc(3 * sizeof(int)) âžœ Mengalokasikan 3 elemen.

  • realloc(arr, 5 * sizeof(int)) âžœ Ukuran array bertambah menjadi 5.

  • Data lama tetap dipertahankan, elemen tambahan bisa diisi setelah realloc().

  • free(arr) âžœ Membebaskan memori setelah digunakan.

2. Mengurangi ukuran blok memori

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

int main() {
    int *arr;
    int n = 5;

    // Alokasi awal untuk 5 elemen
    arr = (int*) malloc(n * sizeof(int));

    if (arr == NULL) {
        printf("Alokasi awal gagal!\n");
        return 1;
    }

    // Mengisi array
    for (int i = 0; i < n; i++) {
        arr[i] = i + 1;
    }

    // Menampilkan array sebelum realloc
    printf("Array sebelum realloc: ");
    for (int i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");

    // Mengurangi ukuran array menjadi 3 elemen
    n = 3;
    arr = (int*) realloc(arr, n * sizeof(int));

    if (arr == NULL) {
        printf("realloc gagal!\n");
        return 1;
    }

    // Menampilkan array setelah realloc
    printf("Array setelah realloc: ");
    for (int i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");

    free(arr); // Bebaskan memori
    return 0;
}

Hasilnya:

Array sebelum realloc: 1 2 3 4 5
Array setelah realloc: 1 2 3
  • malloc(5 * sizeof(int)) âžœ Mengalokasikan 5 elemen.

  • realloc(arr, 3 * sizeof(int)) âžœ Ukuran dikurangi menjadi 3, elemen 4 dan 5 dihapus.

  • Data yang tersisa tetap valid.

3. Penanganan jika realloc() gagal

Jika realloc() gagal (tidak bisa mengalokasikan memori tambahan), maka pointer lama tetap ada dan program tidak crash.

Untuk menghindari kehilangan data, gunakan pointer sementara:

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

int main() {
    int *arr, *temp;
    int n = 3;

    arr = (int*) malloc(n * sizeof(int));

    if (arr == NULL) {
        printf("Alokasi awal gagal!\n");
        return 1;
    }

    // Isi array
    for (int i = 0; i < n; i++) {
        arr[i] = i + 1;
    }

    // Simpan pointer lama
    temp = realloc(arr, 5 * sizeof(int));

    if (temp == NULL) {
        printf("realloc gagal, tetap gunakan pointer lama!\n");
    } else {
        arr = temp;  // Perbarui pointer jika realloc berhasil
        n = 5;
    }

    // Bebaskan memori
    free(arr);
    return 0;
}
  • Jika realloc() gagal, pointer arr tidak akan berubah, dan memori lama tetap tersedia.

Previouscalloc()Nextfree()

Last updated 2 months ago