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);
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);
質問のフレーズはちょっとです。あなたは「割り当てられたメモリブロックに使用できる最大のインデックスは何ですか?」という意味です。答えは配列の場合と同じです。
あなたはメモリを読んだり、書いている場合は、安全の間でインデックスを使用すること(を含む)0とブロックのサイズよりも小さい1(あなたのケースでは、それはインデックス19を意味します)。それはあなたが求めた20の値にアクセスできることを意味します。あなたは、単に同じブロック内の他のポインタとの比較のためにポインタを取得している(とあなたが読んだり、それに書き込みするつもりはありません)、あなたは、さらに1-過去エンドポインタを得ることができる場合
(あなたの場合はインデックス20を意味します)。例を挙げてこれらの事を明確にする
:
はい、buffer[19] = 'a';
はあなたが読み取りまたは書き込み容量にアクセスすることが非常に最後の値です。このメモリに文字列を格納し、それをヌル文字で終了する文字列を必要とする関数に渡す場合、このスロットは最後の値で'\0'
となることを忘れないでください。
は、あなたは次のようにして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;
malloc(x)
がx
バイトを割り当てます。
buffer[0]
にアクセスすると、最初のバイトにアクセスし、buffer[1]
にアクセスして2番目のバイトにアクセスします。
例えばmalloc関数で
char * buffer = (char *) malloc(1);
buffer[0] = 0; // legal
buffer[1] = 0; // illegal
malloc関数の単純なケースでの作業それを自分で(1) – pm100
(1)、私は緩衝液のみ設定することができます[0] = 'A' または私はまた、バッファを設定することができます[1] = 'a'? – Rorschach
ちょうどCで覚えて、インデックスは0ベースです。最初の要素へのインデックスは0です。 – Shiping