Bir bellek adresini bir değişkenle eşleyin [kopya]
Bu bellek konumunda bir yapı oluşturmak için bir bellek adresini bir değişkene nasıl eşlerim? Verilen bellek adresinde bir yapı oluşturmak için aşağıdaki kod parçasını denedim, ancak sadece bölümleme hatasını atıyor?
Koddaki bellek konumu, belirli verileri ayarlamam ve kapı zilini bir işlem kodu ile çalmam gereken bir Giriş Bölgesidir, böylece CPU Giriş verilerini alır ve işlem kodunun giriş bölgesindeki verilerle ne yaptığını yapar.
some_struct* some_struct_obj= (some_struct*)0xc321000000;
memset(some_struct_obj, 0x00, sizeof(some_struct));
Yanıtlar
Bir bellek adresini bir değişkene eşleyin
C ++ 'da herhangi bir değişkenin tam yerini seçmenin bir yolu yoktur. Yalnızca depolama sınıfını seçebilirsiniz: otomatik, statik veya yerel iş parçacığı. Dil uygulaması adresi seçer.
Bu bellek konumunda bir yapı oluşturmak için bir bellek adresini ... ile nasıl eşlerim?
Herhangi bir bellek adresine dinamik depolamalı (değişken olmayan) bir nesne oluşturmak, bellek ayrıldığı ve önemsiz olmayan nesneler içermediği sürece mümkündür. Yerleştirme yeni ifade veya dahili olarak yeni yerleştirme gerçekleştiren bazı standart işlevler kullanılarak elde edilebilir.
Standart C ++ 'da keyfi adresten bellek ayırmanın bir yolu yoktur. Dil uygulaması, değişkenler ve dinamik nesneler için bellek ayırmaya özen gösterir.
Sanal belleğe sahip olmayan gömülü sistemlerde, dil uygulaması belirli bellek adres aralıklarını ayrılmış olarak belgeleyebilir. Böyle bir durumda, bu bellekte nesneler oluşturmak için yeni yerleşimi kullanabilirsiniz. Bu tür adreslerin kullanılması diğer sistemlere taşınabilir olmayacaktır.
Standart olmayan bir yola ne dersiniz? Evet var olabilir. Örneğin, POSIX standardı mmap
işlevi belirtir :
pa=mmap(addr, len, prot, flags, fildes, off);
Parametre
flags
, eşlenen verilerin işlenmesi hakkında diğer bilgileri sağlar. Bayrakların değeri, <sys / mman.h> içinde tanımlanan bu seçeneklerin bit tabanlı VEYA'sıdır:Symbolic Constant Description MAP_SHARED Changes are shared. MAP_PRIVATE Changes are private. MAP_FIXED Interpret addr exactly.
Ne zaman
MAP_FIXED
bayraklar argümanı yer almakta olup uygulama pa değeri olacağı bildiriliraddr
tam olarak.
Bununla birlikte, Linux yönetim sayfalarından takip etmeyi düşünün:
Tek güvenli kullanım
MAP_FIXED
, tarafından belirtilen adres aralığınınaddr
ve uzunluğun daha önce başka bir eşleme kullanılarak rezerve edildiği yerlerdir ; aksi takdirde, kullanımıMAP_FIXED
tehlikelidir çünkü önceden var olan eşlemeleri zorla kaldırır ve çok iş parçacıklı bir işlemin kendi adres alanını bozmasını kolaylaştırır.