2012-03-04 23 views
5

Benim kodudur: VS2010 bu çalıştırmakC++ Bellek ayırma sorunu

#include <string.h> 
int main() 
{ 
    int ii = 123; 
    char str[7] = ""; 
    strcpy(str,"123456"); 
    return 0; 
} 

, hafıza gibidir altında

enter image description here

ben bellekte cc eskiden ne merak ediyorum için? Ve cc'un sayısı nasıl hesaplanır?

cevap

7

Visual Studio'da "Hata Ayıklama" için derleme yaparken, cc 'lar genellikle başlatılmamış belleği doldurmak için kullanılır. Bu şekilde, başlatılmamış belleğe eriştiğinizde daha belirgin olur. Böyle

Access Violation accessing 0xcccccccc 

falan: Eğer başlatılmamış bir işaretçi KQUEUE denerseniz

Örneğin, büyük olasılıkla böyle bir şey alırsınız. Eğer başlatılmamış bellek alanını eriştiğinizde

enter image description here

+7

Ve MS neden dolum değeri olarak '0xCC' seçti? Çünkü 0xCC, x86 komut setindeki tek bayt kesme noktası talimatıdır. Bu şekilde, yanlışlıkla doldurulmamış belleği çalıştırırsanız, anında bir kesme noktasına ulaşır. –

+0

@Rob Bilmiyordum. :) Sanırım bellek korumaya sahip olduğumuza göre daha az anlamlılık var mı? – Mysticial

+2

@Mysticial: gerçekten değil: yalnızca sayfa düzeyinde çalışır (tüm sayfa yürütülebilir olarak işaretlenemez ve yalnızca CPU, OS ve işlemlerin tümü NX-bit'i etkinleştirmeyi kabul ederse). Ancak, 2KB sayfasından 40 baytlık kod kullanırsanız ne olur? Sayfanın yeniden çalıştırılabilir olarak işaretlenmiş olması, sayfanın geri kalan kısmını yürütülebilir, ancak çöp içermelidir :) – jalf

1

, VC2010 hep

0xcc

(bir hata ayıklama derlemesi olarak) derleyici tarafından kullanılan değer gereken sen 0xcccccccc içeren bazı adresini erişmiş konusunda sizi uyaracaktır başlatılmamış belleği doldurun.

İlgili konular