我需要分配 5 個位元組的記憶體。我這樣做:
uint16_t* memory = (uint16_t*) malloc(5);
我的問題是如何將不同的型別存盤到該記憶體并列印出來。具體來說,我需要 3x char、1x float 和 1x int。
uj5u.com熱心網友回復:
如果沒有關于作業的更廣泛的背景關系,就不可能確定您的導師正在尋找的解決方案,但要清楚地malloc()回傳一個指向記憶體的 void 指標,該指標保證以可以解釋為任何基本型別的方式對齊。
這里的使用uint16_t似乎相當隨意,大概是為了測驗您對指標概念和型別轉換的了解。5位元組長度的奇怪選擇也可能是為了突出這樣一個事實,即空間只需要大到足以容納要存盤的最大物件。
這似乎是那些不一定鼓勵良好編碼實踐的學校作業所鐘愛的任務之一。也就是說,可能會尋求以下“骯臟”的解決方案:
uint16_t* memory = (uint16_t*) malloc(5);
char* c = (char*)memory ;
c[0] = 'a' ;
c[1] = 'b' ;
c[2] = 'c' ;
float* f = (float*)memory ;
*f = 1.0 ;
int* i = (int*)memory ;
*i = 123 ;
一個可能超出您的課程材料的更復雜的解決方案是使用聯合:
union
{
uint16_t s ;
char c[3] ;
float f ;
int i ;
}* memory = malloc( sizeof( *memory ) ) ;
memory->c[0] = 'a' ;
memory->c[1] = 'b' ;
memory->c[2] = 'c' ;
memory->f = 1.23 ;
memory->i = 123 ;
如果特定的分配行是“必需的”,那么您可以使用命名的 union 和 cast memory:
uint16_t* memory = malloc(5);
union variant
{
char c[3] ;
float f ;
int i ;
} ;
((union variant*)memory)->f = 1.23 ;
((union variant*)memory)->i = 123 ;
((union variant*)memory)->c[0] = 'a' ;
((union variant*)memory)->c[1] = 'b' ;
((union variant*)memory)->c[2] = 'c' ;
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/441584.html
