2011-08-01 34 views
0

我有這樣的結構:您可以將較小尺寸的結構放入更大的內存中嗎?

typedef struct 
{ 
int data[10]; 
} small_structure; 

和驗證碼:

small_structure *s_struct; 
void * chunk; 

chunk = malloc(1000); 
s_struct = chunk; 

是否確定做這樣的事情?忽略這是浪費記憶的事實。

+0

你想要做[struct hack](http://c-faq.com/struct/structhack.html)嗎? – hugomg

回答

2

是的,沒關係。 malloc將返回適當對齊的內存。然而,只要將任意指定void *指針指向small_structure *變量即可,而不是不是。這意味着你的具體例子很好,但類似:

int function(void *p) 
{ 
    small_structure *s = p; 
    return s->data[0]; 
} 

不是!如果p不適合指針small_structure *,您剛剛導致未定義的行爲。

+0

使用void指針作爲它們之間的錯誤是什麼?例如,我有第二個結構:(large_structure * l_struct),它仍然小於內存塊,在完成使用s_struct之後,我分配了l_struct = chunk,然後開始使用l_struct。 – ZPS

+1

@ZPS:一般來說不好,但是如果你知道你的對齊將永遠是正確的,那就好了。 – Gabe

+0

Gabe說得對。在我的函數示例中,您無法知道's'是否正確對齊。不過,您的問題中的原始示例沒有問題。我只是想在使用'void *'的時候警惕危險的行爲。 –

4

是的,只要有足夠的內存可用,分配更多內存總是合法的。

2

AFAICT,它沒有什麼不對(除了浪費;-)。

請注意,在使用它之前,您必須使用有用的數據填充結構。