SORU
2 NİSAN 2012, PAZARTESİ


"ömür boyu" C string literal

İşaretçi aşağıdaki işlevi tarafından döndürülen ulaşılmaz değil mi?

char *foo( int rc ) 
{
    switch (rc) 
    {
      case 1:           return("one");
      case 2:           return("two");
      default:           return("whatever");
    }
}

C/C yerel bir değişken ömrü tek işlevi içinde neredeyse, değil mi? Olan, char* foo(int) sona erer sonra, artık döndürdüğü işaretçinin bir şey ifade ediyor mu?

Biraz yerel var ömür boyu hakkında kafam karıştı. Kimse bana iyi bir açıklama verebilir misiniz?

CEVAP
2 NİSAN 2012, PAZARTESİ


Evet, yerel bir değişken ömür boyu oluşturulduğu kapsamı (,*{* 9) içinde.
Yerel değişkenler otomatik veya yerel depolama.
Otomatikiçinde oluşturulur kapsamı bittikten sonra otomatik olarak destoryed oldukları için.

Burada ancak, bir uygulama salt okunur bellek tanımlanan ayrılan bir dize. Dize hazır yerel değişkenler farklıdır ve program süresi boyunca hayatta kalırlar.Varstatik süresi[Ref 1]ömür boyu.

Dikkatli bir kelime!
Ancak, bir dize içeriğini değiştirmek için herhangi bir girişim, Tanımlanmamış bir Davranış olduğunu unutmayın. Kullanıcı programları bir dize içeriğini değiştirmek için izin verilmez.
Bu nedenle, her zaman bir dize ilan ederken const kullanmak için teşvik edilir.

const char*p = "string"; 

yerine

char*p = "string";    

C aslında, bir dize c const olmadan olmasa da edebi ilan kaldırılmış. Ancak, bir dize const ile edebi ilan Derleyiciler genellikle dize ikinci durumda değişmez değiştirmek için bir girişim diye bir uyarı verecek avantaj sağlar.

21**:

#include<string.h> 
int main() 
{ 
    char *str1 = "string Literal"; 
    const char *str2 = "string Literal"; 
    char source[]="Sample string"; 

    strcpy(str1,source);    //No warning or error just Uundefined Behavior 
    strcpy(str2,source);    //Compiler issues a warning 

    return 0; 
} 

Çıkış:

cc1: uyarıları hata olarak kabul ediliyor
prog.c: function ‘main’:
prog.:9 c: hata: ‘strcpy’ atar gösterici hedef türünden elemeleri . bağımsız 1 geçen

Derleyici ilk, ikinci durumda ama uyarıyor dikkat edin.


EDİT: Q kullanıcılar burada bir çift tarafından soruluyor cevap vereyim

İntegral rakamları ile anlaşma nedir?
Başka bir deyişle bu kod geçerli:

int *foo()
{
    return &(2);
} 

Cevap, bu kod geçerli değil, kötü oluşur ve derleyici bir hata vermez.
Gibi bir şey

prog.c:3: error: lvalue required as unary ‘&’ operand

Dize hazır l-değerleri.e: içindekileri bir dize ancak bir değişim adresi alabilir.
Ancak, herhangi bir diğer rakamları(int,float,char vb) r-değerleri(c standart terim kullanırbir ifadenin değeribu) ve adresini hiç alınamaz.


[Ref 1]6.4.5/5 "Dize Hazır - Anlambilim": . C99 standart

Çeviri aşaması 7, değer bayt ya da bir kod sıfır bir dize ya da rakamları kaynaklanan her belge karakter dizisi eklenir.Belge karakter dizisini statik depolama süresi bir dizi ve uzunluğu sırası içermesi sadece yeterli başlatmak için kullanılır. Karakter dizelerini, dizi öğe türü char, ve başlatılmış olan bireyin bayt belge karakter dizisi; geniş dizelerini, dizi öğe türü wchar_t ve başlatılmış olan dizinin geniş karakterler...

Bu dizi elemanları uygun değerleri olması koşuluyla farklı olup olmadığı belirtilmemiş.Eğer programın böyle bir dizi değiştirmek için çalışırsa, davranış tanımsızdır.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Chuck Testa

    Chuck Testa

    14 AĞUSTOS 2011
  • funbro1

    funbro1

    11 Aralık 2007
  • Ricardo Cerqueira

    Ricardo Cerq

    28 Mayıs 2008