2017-03-28 8 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関数の単純なケースでの作業それを自分で(1) – pm100

+1

(1)、私は緩衝液のみ設定することができます[0] = 'A' または私はまた、バッファを設定することができます[1] = 'a'? – Rorschach

+2

ちょうどCで覚えて、インデックスは0ベースです。最初の要素へのインデックスは0です。 – Shiping

答えて

7

質問のフレーズはちょっとです。あなたは「割り当てられたメモリブロックに使用できる最大のインデックスは何ですか?」という意味です。答えは配列の場合と同じです。

  • あなたはメモリを読んだり、書いている場合は、安全の間でインデックスを使用すること(を含む)0とブロックのサイズよりも小さい1(あなたのケースでは、それはインデックス19を意味します)。それはあなたが求めた20の値にアクセスできることを意味します。あなたは、単に同じブロック内の他のポインタとの比較のためにポインタを取得している(とあなたが読んだり、それに書き込みするつもりはありません)、あなたは、さらに1-過去エンドポインタを得ることができる場合

  • (あなたの場合はインデックス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]にアクセスして2番目のバイトにアクセスします。

例えばmalloc関数で

char * buffer = (char *) malloc(1); 
buffer[0] = 0; // legal 
buffer[1] = 0; // illegal 
関連する問題