2016-02-19 20 views
5

Her işlem için 8 mb'lik yığının verildiği söylenir. Bu yığın yerel değişkenleri depolamak için kullanılacaktır. Yığından daha fazla bir boyut dizisi alırsam, taşması gerekir mi?Yığın büyük yerel değişkenle taşan?

int main() 
{ 
int arr[88388608]; 
int arr1[88388608]; 
int arr2[88388608]; 
while(1); 
return 0; 
} 

Ancak sonucu alamıyorum!

+2

Yığını taşırken, * beklendiği gibi çalışabilen * tanımlanmamış davranış * elde edersiniz. Ayrıca, bu günlerde derleyiciler oldukça zekiler. Bu diziler kullanılmadığından derleyici neden onlar için alan yaratmalı? –

+0

"int" 'den "volatile int"' ye arr türünü değiştirdiğinizde ne olur? –

+2

Ayrıca, AFAIK, yığının boyutu farklı sistemlere göre değişebilir. –

cevap

5

Derleyicileri optimize etme dünyasına hoş geldiniz!

As-if kuralı nedeniyle, derleyici yalnızca orijinal kodunuzla aynı gözlenebilir sonuçları olan bir şey oluşturmak için gereklidir. ücretsiz eğer Yani derleyici:

  • kullanılmayan diziler kaldırmak
  • boş döngü bacanın ana dışarıdan dinamik diziler
  • mağaza kaldırmak - Ana sadece denecek özel fonksiyon olduğu için bir kez çevre

Eğer yığın taşması gözlemlemek istiyorsanız (kötü biri değil bizim güzel bir site :-)), yapmanız gerekir göre:

  • Ben kadar doğru olabildiğince yazdıklarını yapmak derleyici anlatmak için
  • kaldırıldı bütün optimizasyonu ile ve preferently ayıklama modunda derleme diziler doldurmak için bazı kodlar kullanmak

Aşağıdaki kod ile SIGSEGV yapar clang 3.4.1 cc -g foo.c -o foo

#include <stdio.h> 

#define SIZE 88388608 

void fill(int *arr, size_t size, int val) { 
    for (size_t i=0; i<size; i++) { 
     arr[i] = val; 
    } 
}  
int main() { 
    int arr[SIZE]; 
    int arr1[SIZE]; 
    int arr2[SIZE]; 

    fill(arr, SIZE, 0); 
    fill(arr1, SIZE, 0); 
    fill(arr2, SIZE, 0); 
    printf("%d %d %d\n", arr[12], arr1[15], arr2[18]); 

    return 0; 
} 

olarak derlenmiş ve -O2 optimizasyon seviyesi olarak derlenmiş bile bu kod çalışıyor iken ... Derleyiciler şimdi şunlardır Benim için zekice, ve gerçekten neyin yürütüldüğünü anlamanın tek gerçek yolu olacak derleme kurallarına iyice bakmaya yetecek kadar cesur değilim!

+0

@Lingxi: Cevabınız neredeyse doğruydu. Eğer onu C'ye çevirirseniz ve geri aldığınızda (ve bana bir yorumda ping ederseniz), bunu kendim söylerim çünkü benimki sadece seninki hakkında bir açıklamadır. –

İlgili konular