Zed Shaw の Learn C the Hard Way を学んでいます。ex34の関数定義のコードに混乱しています。ex34 では、Zed が動的配列の実装方法を教えてくれます。darray.h のコード:
typedef struct DArray {
int end;
int max;
size_t element_size;
size_t expand_rate; /* it's 300 by default. */
void **contents;
} DArray;
DArray *DArray_create(size_t element_size, size_t initial_max);
int DArray_expand(DArray *array);
/* other operations... */
私を混乱させたコードはdarray.cにあります:
DArray *DArray_create(size_t element_size, size_t initial_max)
{
DArray *array = malloc(sizeof(DArray));
array->max = initial_max;
array->contents = calloc(initial_max, sizeof(void *));
array->end = 0;
array->element_size = element_size;
array->expand_rate = DEFAULT_EXPAND_RATE; /* defined in header, which is 300 */
return array;
}
static inline int DArray_resize(DArray *array, size_t newsize)
{
array->max = newsize;
void *contents = realloc(array->contents, array->max * sizeof(void *));
array->contents = contents;
return 0;
}
int DArray_expand(DArray *array)
{
size_t old_max = array->max;
DArray_resize(array, array->max + array->expand_rate);
memset(array->contents + old_max, 0, array->expand_rate + 1); // confused
return 0;
}
/* Definitions of other operations... */
だから私の質問は、memset
呼び出された byの 3 番目の引数DArray_expand
がarray->expand_rate + 1
代わりにあるのはarray->expand_rate
なぜですか? 展開後の配列の長さは 400 (初期の長さが 100 の場合)contents[0]
からcontents[399]
. 初期化する必要がある要素は から までの範囲でありcontents[100]
、contents[399]
の 3 番目の引数は 300 であるmemset
必要がarray->expand_rate
あります。誰かに説明してもらえますか?
私の投稿を編集してくれてありがとう。インライン コード md 構文を使用できることを忘れていました。
編集: このコードでも memset を使用していることに混乱しています。私のコンピューターの memset の man ページには、次のように書かれていました。
memset() 関数は、len バイトの値 c (unsigned char に変換) をバイト文字列 b に書き込みます。
私は memset の実装をグーグルで検索しました。そして、私はこのリンクからこれを得ました:
#include <stddef.h> /* size_t */
void *memset(void *s, int c, size_t n)
{
unsigned char* p=s;
while(n--)
*p++ = (unsigned char)c; // This line confused me..
return s;
}
私のOS(Darwin 12.0.0)では、との値sizeof(void *)
はsizeof(int *)
8です。もう少し試してみました。私のOSのすべての種類のポインターのサイズは8のようです。ポインターのサイズが8の場合、次のコードで何が起こりますか:
*p++ = (unsigned char)c; /* the value of c is 0. size of
unsigned char is 1 in my OS */
Zed のコードにバグがある場合、その修正方法を教えていただけますか?