2011-06-23 17 views
24

ptr adlı bir boşluk işaretçim var. Bu değeri birkaç bayt ile arttırmak istiyorum. Bunu yapmanın bir yolu var mı?Boşluk işaretçisi bir bayt artırılıyor? Iki?

Daha fazla değişken oluşturmadan bunu yerinde yapmak istediğimi lütfen unutmayın.

ptr = (void *)(++((char *) ptr)); gibi bir şey yapabilir miyim?

cevap

48

İşaretçi aritmetiği, sivri nesnenin boyutuna göre tanımlandığından bir boşluk işaretçisinde aritmetik gerçekleştiremezsiniz.

void* p = /* get a pointer somehow */; 

// In C++: 
p = static_cast<char*>(p) + 1; 

// In C: 
p = (char*)p + 1; 
+1

, bu reinterpret_cast değil mi? – Balk

+4

@ Balk: 'static_cast' yeterlidir. –

15

void işaretçisinde aritmik işlemler yapılamaz.

Derleyici, void işaretçisinin işaret ettiği öğenin boyutunu biliyor. Bunu yapmak için işaretçiyi (char *) yapabilirsin.

Gcc'de void boyutunu 1 olarak değerlendiren bir uzantı vardır. böylece, bir bayt olarak bir ofset eklemek için void*'da aritematiği kullanabiliriz, ancak bunu kullanmak, taşınabilir olmayan bir kod verecektir.

+0

o 'sizeof (void)' verimleri 'Çünkü 1' mümkündür. –

+0

@Blagovest Buyukliev: GCC'de bir boşluğun büyüklüğünü 1 olarak ele alan uzatmadır. –

+1

@Blag: Her zaman olduğu gibi, lütfen '-pedantic' ile derleyin. :) – Xeo

4

Sadece void* artan gcc çalışmak oluyor:

yapabilirsiniz, ancak, o pointer üzerinde aritmetik ve sonra bir void* geri dönüştürmek, bir char* işaretçiyi döküm o zamanlar char* için döküm ve: bunu açık olmak için bu yüzden

#include <stdlib.h> 
#include <stdio.h> 

int main() { 
    int i[] = { 23, 42 }; 
    void* a = &i; 
    void* b = a + 4; 
    printf("%i\n", *((int*)b)); 
    return 0; 
} 

o olsa kavramsal (ve resmen) yanlış.

void* a = get_me_a_pointer(); 
void* b = (void*)((char*)a + some_number); 

Bu, bir takım baytlarla arttığınızı açıkça gösterir.

+1

Her zaman olduğu gibi, lütfen '-pedantic' ile derleyin. :) GCC tarafından uygun olmayan bir uzantısı. – Xeo

+0

Sanırım şımarık :) - doğruluk için cevabı düzenledim – tdammers

-1

Sen yapabilirsiniz: GCC

++(*((char **)(&ptr))); 
+4

Evet, ama neden _would_ sen? İyi bir sebepten ötürü yaptıklarını ayrıştırmayı gereksiz yere zorlaştıran korkunç bir kod. Ayrıca, C stili dökümler C++ 'da cesaretlendirilmemelidir, ancak buradaki sorunlardan en azı budur. –

+2

Ayrıca alevli bir çubuğu da gözünüze sokabilirsiniz. Muhtemelen '++ (* ((char **) (& ptr))) 'a bakmaktan daha az zarar verirdi. –