2017-03-28 24 views
0

有關malloc的相當簡單的問題。分配區域內可以設置的最大值是多少。例如:哪個指針值是malloc調用的最大值

char *buffer; 
buffer = malloc(20); 
buffer[19] = 'a'; //Is this the highest spot I can set? 
buffer[20] = 'a'; //Or is this the highest spot I can set? 
free(buffer); 
+1

使用malloc的簡單情況下隨着一個malloc(1),可以我只設置緩衝液[0] = 'a' 或我還可以設置緩衝液(1) – pm100

+1

工作說出來[1] ='a'?在C中只記得 – Rorschach

+2

,索引是0的。所以第一個元素的索引是0. – Shiping

回答

7

您的問題的措辭是有點關閉。你的意思是「我可以用於分配的內存塊的最大索引是多少」。答案與數組相同。

  • 如果你正在讀或寫的內存,你可以放心的使用0到1之間的索引(包括)比塊的大小少一個(在你的情況,這意味着指數19)。總之,這意味着你可以訪問你要求的20個值。

  • 如果僅獲得指針具有相同塊內的其它指針的比較(和你不會讀或寫至其),則可以額外地獲取指針的一過去的最端(在你的情況下,這意味着索引20)。

爲了舉例說明這些東西:

  1. 是,buffer[19] = 'a';是你可以在讀或寫能力進入最後的值。不要忘記,如果你想在這個存儲器中存儲一個字符串,並把它交給期望以空字符結尾的字符串的函數,那麼這個插槽是你最後一次把這個值設置爲'\0'的機會。

  2. 你被允許訪問buffer[20]以下方式:

    char *p; 
    for(p = &buffer[0]; p != &buffer[20]; ++p) 
    { 
        putc(*p, stdout); 
    } 
    

    這是非常有用的,因爲我們往往會遍歷內存和存儲大小的方式。如果我們不得不在整個地方減去1,那麼這會使我們的代碼不易讀。

    哦,它給你的絕招:

    size_t buf_size = 20; 
    char *buffer = malloc(buf_size); 
    char *start = buffer; 
    char *end = buffer + buf_size; 
    size_t oops_i_forgot_the_size = end - start; 
    
+0

真棒答案+1。您可能會選擇添加爲什麼可能需要在內存結束後指定一個(不可解引用)指針的實例。 – Vality

+1

好吧,我添加了一個簡單的例子,但沒有提供利用這種行爲的其他模式的詳盡列表。 – paddy

+0

不應該'oops_i_forgot_the_size'輸入'ptrdiff_t'? –

2

malloc(x)將分配x字節。

所以通過訪問buffer[0]你訪問第一個字節,通過訪問buffer[1]你訪問第二個。

例如

char * buffer = (char *) malloc(1); 
buffer[0] = 0; // legal 
buffer[1] = 0; // illegal