2013-01-24 19 views
19

standart C++ [san 5.7] söyler:Dizi olmayan bir türün "bir-uçtan uca" işaretçisi C++ 'da geçerli bir kavram mıdır?

işaretçi işlenen ve aynı dizi nesne elemanlarına sonucu noktası veya dizi nesnesinin son eleman son bir iki, değerlendirme yapamaz halinde taşma üretmek; aksi halde, davranış tanımsızdır.

Yani, dizilerden başka türlerin birer birer sonundaki işaretçiler undefined olduğu varsayılır mı? Örneğin

:

int a = 0; 
vector<int> v(&a, (&a)+1); 

yukarıdaki pasajı derler ve (++ g) ile sadece iyi çalışır, ancak geçerli?

+0

Dizilerden başka türlerin birer birer sonundaki işaretçilerin undefined olup olmadığı hakkında yorum yapmak isterim. ** İşaretçiler ** her zaman tanımlanmıştır, çünkü bunlar sadece sayılardır, adreslerdir. Ancak, bu işaretçi tarafından ** ** değeri tanımsızdır. Bu işaretçileri kullanmamalısınız. Ama 'vektör' yapıcısı onları ayırmıyor, bu yüzden sorun yok. – NIA

+0

Doğru, ancak adres alanı sonsuz değil. Dolayısıyla, adres alanındaki son öğeye bir işaretçi var. İşaretçiyi artırmak hiç mantıklı olmaz. –

+7

İşaretçiler basit sayılar değildir. C++ standardı, işaretçilerle isteğe bağlı ekleme ve çıkarma işlemlerini kullanamayacağınızı açıkça belirtir. Özellikle, 1-tabanlı algoritmaları barındıracak bir diziden önce bir işaretçiyi kullanma alıştırması, tanımlanmamış davranışlara neden olur. AFAIK, bilgisayar belleğidir, ya da eskiden kullanılan bir mimaridir. Burada, geçerli belleğe bir işaretçi yazmacına işaret etmeyen bir değerin yüklenmesi bir tuzağa neden olabilir. – JoergB

cevap

25

Hayır, bu yasaldır. 5.7 (4) - teklifinizden önce bir paragraf - diyor ki: "Bu işleçlerin amacı için, bir dizi olmayan nesneye yönelik bir işaretçi, nesnenin türüne sahip bir uzunluk dizisinin ilk öğesi olan ilk öğesinin bir işaretçisi ile aynı davranır. onun eleman türü olarak. "

+0

"geçerli" demek, "yasal" değil, farz ediyorum. aksi halde birçok programcının hapse girmesi gerekebilir. –

+0

Evet. 'legal' = "C++ dil belirtimine göre geçerli" – JoergB

+0

JoergB: Teşekkürler! Bu cümleyi tamamen özledim. –

İlgili konular