2013-08-01 29 views
12

Aşağıdaki kod, char dizisinde salt dizesinde kullanılabilen ilk karakteri gösterir. Öyle mi ?:İşaretçiler Char Const

const char * ptr = "String one"; 

Şimdi ptr başlar başka bir hafıza konumuna işaret etmek zaman:

ptr = "String two"; 

Ne ilk karakter diziye olur? Yürütme bittiğinde bu hafıza konumu serbest mi?

+2

Dize değişmezleri statik ayırmalardır. Serbest bırakılmaları gerekmiyor. –

+0

Bu soruyu da kontrol edin: [char-char * string-literals kullanarak başlatılmalı mıyım?] (Http://stackoverflow.com/questions/9504588/should-i-free-char-initialized-using-string-literals) – sidyll

+1

Neden serbest bırakılmalı mı? işaretçi sadece farklı bir dizgi değişmezini işaret eder ve kabul edilen cevapta açıklandığı gibi dize değişmezlerinin statik depolama süresi vardır, böylece serbest kalmazlar. – 0decimal0

cevap

7

Standart, yalnızca dize değişmezlerinin statik depolama süresi olduğunu, yani değişkenin ömrünün program bitene kadar olduğunu ve program başladığında başlatıldığını belirtir. [...] baytlı karakter dizisi, daha sonra statik depolama süresi ve sekansı ihtiva sadece yeterli uzunlukta bir dizi başlatmak için

kullanılır: C11 draft standard ilgili bölümü 6.4.5 paragraf olup. [...]

Sadece okunabilir bellekte olabilir ve büyük olasılıkla, ancak bu uygulama tanımlıdır. Serbest bırakılmasına gerek yoktur, sadece malloc aracılığıyla dinamik olarak ayrılan belleğe bir sonraki free numaralı çağrıya ihtiyaç duyar.

ben bu programı kullanıyorsanız:

int main() 
{ 
    const char * ptr = "String one"; 

    return 0; 
} 

ve biz gcc ile inşa ve sonra objdump kullanın:

objdump -s -j .rodata a.out 

Biz gerçekten salt okunur saklanır bu durumda olduğunu göreceksiniz veri bölümü:

Contents of section .rodata: 
    400580 01000200 53747269 6e67206f 6e6500 ....String one. 

Kendiniz de koşabilirsiniz here

+0

Program kapalıyken otomatik olarak hafızadan silinecek mi? – 2013Asker

+0

@ 2013Asker Evet, programınız çıktığında, kaynakları sisteme salıverir. –

+4

Tipik bir barındırılan uygulamada, bir dize değişmezi, fiziksel ROM'da değil, işletim sistemi tarafından salt okunur olarak işaretlenen bellekte olacaktır ve program bittiğinde programınızın belleğinin neredeyse tamamı serbest bırakılacaktır. Özgür bir uygulamada, farklı bir hikaye olabilir; Çok düşük seviyeli bir sistem, kodu ve statik verileri hiçbir zaman silinmeyen ROM'da saklanan sadece bir programı çalıştırabilir. –