2016-10-14 46 views
0

我正在尋找將我的空指針值逐個投射到不同的值。我只是使用函數大小添加最後一個類型的字節數?測試值只是我想用來放置這些值的內存空間。如何將大尺寸的空指針依次投射到不同類型

void* test; 

int* a = (int*)test; 
*a = 5; 

char*b = (char*)(test+sizeof(int)); 
*b = 'b'; 

int* c = (int*)(test+sizeof(int)+sizeof(char)) 
*c = 6; 
+1

你最終想要完成什麼?你的問題很不明確,你的例子在每個地方都有未定義的行爲(使用未初始化的變量,沒有正確對齊的情況下訪問指針)。如果你想要一些內存有一個'int'後跟一個'char'後跟另一個'int',爲什麼不使用'struct'? – jamesdlin

+0

也只是記得:在'void *'上做數學在技術上是不允許的。一些編譯器讓你這樣做,但它是非標準的。 –

+0

@jamesdlin,測試變量只是我想要使用的x字節的空白空間。我只是沒有在這裏初始化。 int,char,int只是一個例子,我用它來看待這個問題。 – chonglawr

回答

1

這不是你想要做的,我想。

如果您想將一些對象複製到內存中,那麼您應該使用memcpychar *來訪問某些內存緩衝區。是的,你會在每個memcpy後面前移sizeof()個字節。

char指針用於字節。 void指針用於代碼不知道類型是什麼的時候,比如將用戶定義的回調函數和數據結構傳遞給庫時。

創建例如線程:

int pthread_create(pthread_t *thread, const pthread_attr_t *attr, 
        void *(*start_routine) (void *), void *arg); 
2

這最好用char指針和memcpy完成。使用char指針可讓您執行簡單的指針數學運算(並避免strict aliasing rule出現任何問題)。使用memcpy可以避免任何對齊問題。

在下面的函數中,第一個參數是指向內存的指針,第二個參數是chars中內存的大小。

void foo(void *test, int size) 
{ 
    if (size < 2*sizeof(int) + 1) 
     return;   // buffer is not big enough 

    char *a = test;     // int 
    char *b = a + sizeof(int);  // char 
    char *c = b + 1;    // int 

    int value = 5; 
    memcpy(a, &value, sizeof(int)); 

    *b = 'b'; 

    value = 6; 
    memcpy(c, &value, sizeof(int)); 
} 

若要將此項擴展到任意數量的項目,我會按如下所示編寫代碼。 (請注意,這裏沒有安全網,傳遞給函數的緩衝區必須足夠大以容納所有值。)

void bar(void *test) 
{ 
    char *ptr = test; 

    int value = 5; 
    memcpy(ptr, &value, sizeof(int)); 
    ptr += sizeof(int); 

    *ptr++ = 'b'; 

    value = 6; 
    memcpy(ptr, &value, sizeof(int)); 
    ptr += sizeof(int); 

    // ... 
} 
+1

應該指出,這個內存不能直接使用,存儲的對象必須先被複制到一個正確類型的實際變量,然後才能被讀取。 – 2501

+0

@ 2501同意。 OP從未回答過這個問題,*「你最終想要完成什麼?」*一種可能的應用是序列化。在這種情況下,你是正確的,變量在使用之前需要反序列化。 – user3386109