2012-07-15 17 views
7

Bu çalışma gibi bir şeyi nasıl yapabilirim? Ne "nasıl KQUEUE/a void* üzerinde gösterici aritmetiği yok" "iş" tarafından YaniC'deki "raw" bellekten nasıl tip/okuma değerleri yazılır?

void *memory = malloc(1000); //allocate a pool of memory 
*(memory+10) = 1; //set an integer value at byte 10 
int i = *(memory+10); //read an integer value from the 10th byte 

cevap

6

Kolay örnek: unsigned char dizisi

void *memory = malloc(1000); //allocate a pool of memory 
uint8_t *ptr = memory+10; 
*ptr = 1 //set an integer value at byte 10 
uint8_t i = *ptr; //read an integer value from the 10th byte 

Sen de sayıları kullanmayı olarak hafızayı tedavi, ama sonra bir kerede ayarlarken bayt miktarı hakkında dikkat etmesi gerekir.

+0

"Ara" tipinde bir işaretçi oluşturmak yerine, boşluk işaretçisini yayınlamak mümkün mü? – dtech

+0

Tabii ki, açıklık uğruna bir ara temsil kullanın – ziu

3

demek varsayın? Yapamazsın; Hafıza parçalarını okumakla ilgileniyorsanız, tipik olarak bir char*'a göndermeniz gerekir. Tabii ki, durum buysa, başlamak için char* olarak bildirin.

+0

Her türlü yazıyı okumak/yazmakla ilgilenmiyorum, sadece char. – dtech

+0

@ddriver: Bu hiçbir şeyi değiştirmez. İşaretçiyi çevirmelisin. Tür bilinmediğinde nasıl davranılması ve/veya aritmetik yapılmasını beklersiniz? Hiç bir anlamı yok. Temel türün ne olduğunu öğrenmek için ek bilgi vermeniz gerekecektir. –

4

Kurallar basit:

  • (işlev işaretçileri hariç) her işaretçi tipi kaybı olmadan, ve boşluk * dan dökülebilir.
  • void * işaretçiler üzerinde işaretçi aritmetiği gerçekleştiremezsiniz ve bunları dredüre edemezsiniz
  • sizeof (char) 1'e eşittir; böylece bir karakter işaretçisi artırma "ham" işaretçi değeri Bundan

Eğer "ham" işaretçi aritmetiği yapmak istiyorsanız size ve char yayın yapmayı olduğunu gördükten * için "1 ekleyerek" anlamına gelir.