我正在尋找將我的空指針值逐個投射到不同的值。我只是使用函數大小添加最後一個類型的字節數?測試值只是我想用來放置這些值的內存空間。如何將大尺寸的空指針依次投射到不同類型
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;
我正在尋找將我的空指針值逐個投射到不同的值。我只是使用函數大小添加最後一個類型的字節數?測試值只是我想用來放置這些值的內存空間。如何將大尺寸的空指針依次投射到不同類型
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;
這不是你想要做的,我想。
如果您想將一些對象複製到內存中,那麼您應該使用memcpy
和char *
來訪問某些內存緩衝區。是的,你會在每個memcpy
後面前移sizeof()
個字節。
char
指針用於字節。 void
指針用於代碼不知道類型是什麼的時候,比如將用戶定義的回調函數和數據結構傳遞給庫時。
創建例如線程:
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
void *(*start_routine) (void *), void *arg);
這最好用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);
// ...
}
應該指出,這個內存不能直接使用,存儲的對象必須先被複制到一個正確類型的實際變量,然後才能被讀取。 – 2501
@ 2501同意。 OP從未回答過這個問題,*「你最終想要完成什麼?」*一種可能的應用是序列化。在這種情況下,你是正確的,變量在使用之前需要反序列化。 – user3386109
你最終想要完成什麼?你的問題很不明確,你的例子在每個地方都有未定義的行爲(使用未初始化的變量,沒有正確對齊的情況下訪問指針)。如果你想要一些內存有一個'int'後跟一個'char'後跟另一個'int',爲什麼不使用'struct'? – jamesdlin
也只是記得:在'void *'上做數學在技術上是不允許的。一些編譯器讓你這樣做,但它是非標準的。 –
@jamesdlin,測試變量只是我想要使用的x字節的空白空間。我只是沒有在這裏初始化。 int,char,int只是一個例子,我用它來看待這個問題。 – chonglawr