Dizisi

2011-11-14 24 views
10

böyle kod yok:Dizisi

#include <iostream> 

int main() 
{ 
    int size; 
    std::cin >> size; 

    size = size + 1; 
    int tab3[size]; 

    tab3[0] = 5; 
    std::cout << tab3[0] << " " << sizeof(tab3) << std::endl; 
    return 0; 
} 

sonucudur:

$ g++ prog.cpp -o prog -Wall -W 
$ ./prog 
5 
5 24 

Neden bu kod bile derler? Dizinin uzunluğu sabit bir değişken mi olmalı?

G ++ sürüm 4.4.5 kullandım.

cevap

13

C++ 'daki değişken uzunluktaki diziler GCC'de bir uzantı olarak kullanılabilir.Tüm uyarılar ile derleme sizi bu gerçeğe karşı uyarmalıdır (-pedantic dahil)

+0

+1 için daha iyidir, ben 'nineof()' in de sabit olmadığı konusunda hiçbir fikrim yoktu. Eğer 'sizeof()' i kullanmayı düşündüğümde bunun bir sebepten dolayı başarısız olmasını beklerdim. –

+0

@ MichaelKrelin-hacker: Yine, bir uzantı olarak ... VLA'lar bir 'timeeof()' çalışma zamanı gerektirir, bu yüzden C99 standardının bir parçasıdır. Bu sadece bir C++ türü değil. 'Decltype' ve tüm bunları düşünün ... –

+0

Bu, mevcut değil gibi görünüyor * var * yığın üzerinde bellek ayırma standart yöntem. Yerleşim-yeni ile nesne yapımını halledebiliriz, fakat C++ 'da yığında değişken miktarda ham bellek elde etmek imkansızdır. –

7

Bu C99 özelliğidir, C++'nin bir parçası değildir. Bunlar yaygın VLAS olarak (Değişken Uzunluk Diziler olarak adlandırdığımız

bunu reddedilecektir -pedantic ile g++ çalıştırırsanız

fazla bilgi için GCC docs bakın

Ayrıca bkz.:... VLAs are evil

2

GCC, VLA'nın veya değişken uzunluklu dizileri sağlar. Daha iyi bir uygulama, bir işaretçi oluşturmak ve alanı ayırmak için new anahtar sözcüğünü kullanmaktır. VLA'lar MSVC'de mevcut değildir, bu nedenle ikinci seçenek çapraz platform kodu