Langsung ke konten utama

Penyimpanan String dalam Bahasa C

Pada program bahasa C, sebuah string dapat dirujuk baik menggunakan pointer menuju karakter atau sebagai array karakter.

char str[4] = "MKN"; /*Satu tambahan untuk string terminator*/
/* OR */
char str[4] = {‘G’, ‘f’, ‘G’, '\0'}; /* '\0' adalah string terminator */


Ketika string dideklarasikan sebagai karakter array, maka string tersebut akan disimpan seperti tipe data array lainnya dalam bahasa C. Contoh, jika str[] adalah variabel auto, maka string akan disimpan pada segmen stack, namun jika string disimpan sebagai tipe variabel global atau static, maka string akan disimpan pada segmen data.

String Menggunakan Pointer Karakter
Penyimpanan string untuk pointer karakter dapat dilakukan dengan dua cara:

satu, String Read Only dalam Segmen Berbagi.
Ketika sebuah nilai string secara langsung ditetapkan ke pointer, pada sebagian besar kompilator, string tersebut akan disimpan dalam block read only atau secara umum pada segmen data yang dibagikan antara fungsi.

char *str = "MKN";

Pada contoh variabel str nilai "MKN" disimpan dalam lokasi berbagi read only, namun pointer str dismpan di dalam memori read-write. Dapat dilakukan perubahan str untuk menunjuk nilai lokasi yang lain tetapi tidak dapat dilakukan perubahan nilai str saat ini. Jadi, string semacam ini hanya boleh digunakan ketika user tidak ingin melakukan perubahan string pada tahap lanjutan dalam suatu program.

dua, Alokasi Dinamis pada Segmen Heap
String disimpan seperti halnya alokasi memori dinamis pada bahasa C dan dibagikan pada berbagai fungsi.

char *str;
int size = 4; /*satu ruang ekstra untuk ‘\0’*/
str = (char *)malloc(sizeof(char)*size);
*(str+0) = 'G';
*(str+1) = 'f';
*(str+2) = 'G';
*(str+3) = '\0';

Perhatikan beberapa contoh berikut untuk lebih memahami tentang cara penyimpanan string.

Contoh 1, Melakukan Modifikasi String
Program berikut akan mengalami crash karena baris program *(str+1) = 'n' mencoba untuk menulis pada memori read only.

int main()

{

char *str;

str = "MKN"

// disimpan pada bagian bagian

// dari read only data segmen

 

*(str+1) = 'n'

// Permasalahan: mencoba untuk

// memodifikasi memori read

// only

 

getchar();

 

return 0;

}


Program berikut dapat bekerja secara sempurna karena str[] disimpan dalam segmen stack writable.

int main()

{

char str[] = "GfG"

// Disimpan pada segmen stack

// seperti variabel auto

// lainnya

 

*(str+1) = 'n'

// Tidak ada masalah: String

// adalah MKN

getchar();

return 0;

}


Program berikut akan bekerja secara sempurna sebagai data pada str yang disimpan dalam segmen heap writable.

int main()

{

int size = 4;

 

// Disimpan pada segmen heap

// seperti alokasi memori

// dinamis lainnya

char *str = (char *)malloc(sizeof(char)*size);

*(str+0) = 'M';

*(str+1) = 'K';

*(str+2) = 'N';

*(str+3) = '\0';

 

*(str+1) = 'n'

// No problem: String saai ini

// adalah MKN

 

getchar();

 

return 0;

}



Contoh 2, Mengembalikan Nilai String dari Sebuah Fungsi
Program berikut dapat bekerja secara sempurna sebagai string yang disimpan dalam segmen berbagi dan data yang disimpan akan tetap ada meskipun telah dilakukan pengembalian nilai dari getString().

char *getString()

{

char *str = "MKN"

// Disimpan pada bagian read

// only dari segmen berbagi

 

// No Problem: tetap di alamat

// str setelah return

// getString()

return str;

}

 

int main()

{

printf("%s", getString());

getchar();

return 0;

}


Program berikut akan bekerja secara sempurna sebagai string yang disimpan dalam segmen heap dan datanya disimpan dalam segmen heap yang sama meskipun dilakukan pengembalian nilai dari getString().

char *getString()

{

int size = 4;

char *str = (char *)malloc(sizeof(char)*size); 

// Disimpan dalam segmen heap

 

*(str+0) = 'M';

*(str+1) = 'K';

*(str+2) = 'N';

*(str+3) = '\0';

// No problem: string tetap

// pada str setelah return

// getString()

 

return str;

}

 

int main()

{

printf("%s", getString());

getchar();

return 0;

}


Tetapi, program berikut kemungkinan akan menghasilkan beberapa garbage data sebagai string yang disimpan dalam frame stack dari fungsi getString() dan data mungkin tidak berada disana setelah mengembalikan nilai getString().

char *getString()

{

char str[] = "MKN"

// Disimpan pada segmen stack.

 

// Problem: string mungkin

// tidak dapat ditampilkan

// setelah return getString().

 

// Permasalahan tersebut dapat

// diselesaikan jika

// menambahkan static sebelum

// char, atau static char

// str[] = "MKN";.

return str;

}

 

int main()

{

printf("%s", getString());

getchar();

return 0;

}


Komentar

  1. Apa yang dimaksud dengan string pada bahasa C?

    BalasHapus
    Balasan
    1. String pada bahasa C adalah beberapa area memori yang telah dicadangkan dalam beberapa cara melaui alokasi memori statis ataupun alokasi memori dinamis yang berisi urutan byte yang mewaliki urutan karakter menurut beberapa aturan pengkodean ASCII dan UTF-8.

      Hapus
    2. Sring merupakan urutan nilai karakter yang dapat diubah-ubah.

      Hapus
    3. String adalah array dimana satu karakter ditempatkan pada setiap sel array tersebut, dengan nilai karakter '\0' ditempatkan pada sel yang mengikuti karakter terakhir dalam string, yang menandai akhir dari string.

      Hapus
  2. Bahasa C sebenarnya tidak memiliki tipe data khusus yang disebut string. String disebuat sebagai array karakter dalam bahasa C.

    BalasHapus

Posting Komentar

Respon komentar 7 x 24 jam, so please be patient :D