Di sini "Halo" adalah urutan/array karakter. Ini adalah variabel lokal dan harus hilang segera setelah fungsinya kembali. Lalu kenapa kita bisa mendapatkan nilai yang benar?
"Hello" adalah string literal dan akan ada selama masa program. Mengutip bagian yang relevan dari standar C99:
6.4.5 String literal
...Urutan karakter multibyte kemudian digunakan untuk menginisialisasi larik dengan durasi penyimpanan statis dan panjangnya cukup untuk memuat urutan...
6.2.4 Durasi penyimpanan benda
Objek yang pengidentifikasinya dideklarasikan dengan tautan eksternal atau internal, atau dengan penentu kelas penyimpanan statis memiliki durasi penyimpanan statis. Masa pakainya adalah keseluruhan eksekusi program dan nilai tersimpannya diinisialisasi hanya sekali, sebelum program dimulai.
Nilai kembalian fungsi harus const char* karena upaya untuk mengubah string literal adalah perilaku yang tidak terdefinisi.
personhmjdschedule27.08.2012
comment
Apakah literal Strin tidak disimpan di tumpukan? Apakah mereka dialokasikan dari heap?
- person; 27.08.2012
comment
@GreatCoder Mereka dialokasikan dalam memori read-only, kemungkinan disebut .rodata atau linker-gibberish serupa.
- personLundin; 27.08.2012
comment
@GreatCoder, mereka tidak disimpan di stack atau heap. Mereka akan dikompilasi langsung dalam biner yang dihasilkan. Saya berpikir wilayah biner tempat literal string dikompilasi diberi nama area data.
- personhmjd; 27.08.2012
comment
@hmjd Biasanya linker akan memiliki satu segmen .data dan satu segmen .rodata yang mana segmen pertama adalah untuk semua variabel durasi penyimpanan statis (yang tidak diinisialisasi ke nol, yaitu dalam .bss) dan segmen terakhir adalah untuk variabel read-only, yaitu konstanta dan string literal.
- personLundin; 27.08.2012
comment
@Lundin, terima kasih. Saya mengetahui dua bagian tersebut (diinisialisasi dan tidak) tetapi tidak tahu namanya.
- personhmjd; 27.08.2012
comment
Salah satu cara untuk memikirkannya adalah dengan menganggap string literal seperti "a" setara dengan adanya deklarasi static const char string_a[] = {'a', '\0'};, dan semua penggunaan "a" diganti dengan string_a, secara global, dengan kemungkinan tabrakan juga akan diciutkan.
- personunwind; 27.08.2012
Fungsi tersebut menghancurkan nilai hanya setelah mengembalikan kontrol.
Jadi, pada saat pernyataan return ditemukan, "Halo" ditempatkan untuk mengembalikan nilai dan kemudian fungsi tersebut menghancurkan cakupannya;
personvivek_jonamschedule27.08.2012
comment
Maka itu akan crash saat runtime. pertanyaan menyebutkan Lalu kenapa kita bisa mendapatkan nilai yang benar
- personNeel Basu; 27.08.2012
comment
Anda salah karena string literal bukanlah variabel lokal (otomatis) dan tidak dialokasikan pada tumpukan, melainkan sebagai memori statis hanya-baca yang konstan.
- personLundin; 27.08.2012
bahkan jika string dihapus (variabel lokal atau alokasi dinamis dengan malloc() dan free()) , saat Anda mengembalikan sebuah pointer, nilainya bisa saja benar. tapi, ini adalah perilaku yang tidak dapat dijelaskan.
char*
bukanconst char*
bukan UB? - person Neel Basu   schedule 27.08.2012