2016-09-12 7 views
0

私はユーザ入力を読み込み、それをstrtok()を使ってトークンに解析しようとしています。reallocが配列のサイズを更新しないのはなぜですか?

int main(){ 
char argv[200]; 
char** tokenList = NULL; 

printf("shell>>"); 
scanf("%[^\n]%*c", argv); 
int len = 0; 
char* line = strtok(argv, " "); 
while (line != NULL) { 
    printf("%s\n", line); 
    printf("%lu\n", sizeof(tokenList) + (sizeof(char*) * (len+1))); 
    tokenList = realloc(tokenList, sizeof(tokenList) + (sizeof(char*) * (len+1))); 
    printf("%lu\n", sizeof(tokenList)); 
    char* p = malloc(sizeof(char) * (sizeof(line) + 1)); 
    p=line; 
    tokenList[len] = p; 
    len++; 
    line = strtok(NULL, " "); 
    } 

3つのprint文は私のデバッグ目的としたものであり、私は何が起こっているかを把握することはできません。 はここに私のコードです。私はシェルを実行し、「bはc」を入力すると、私の出力は以下の通りです:

a 
16 
8 
b 
24 
8 
c 
32 
8 

はなぜ、配列のサイズは、reallocの呼び出しによって更新され得ていないtokenListですか?

+1

ポインタが配列ではありません!そしてそれはとにかくCの仕組みではありません。動的長さの配列はCにありません。すべての型は静的に宣言されています。 'realloc'はメモリブロックの大きさを変更します(' malloc'はそれを割り当てます)。 – Olaf

+0

'sizeof()'はコンパイル時にのみ動作し、実行時には動作しません。指定されたオブジェクト/変数のサイズを決定します。 –

+1

@Olaf: "Cに動的長さの配列はありません" VLA(可変長配列)はもちろんありますが、各VLAオブジェクトのサイズは実行時に固定されています。この言葉は、OPが求めていることとは関係ありません。 –

答えて

1

ポインタ上でsizeof演算子を使用しています。これにより、指し示されたデータの長さではなく、ポインタのサイズがバイトになります。 tokenListはアドレスを格納する変数にすぎないので、変数のサイズではなく、変数のサイズを取得する理由を想像するのは簡単です。

Cでは、ヒープに割り当てられた配列はサイズを知らないので、開発者はそれを知り、必要なときには必要に応じて格納/更新する必要があります。

sizeofを直接使用することができる唯一のケースは、配列が静的またはローカルストレージ(ヒープ上ではなく)で宣言されている場合です。この状況では、sizeofは、配列の合計バイト長を返します。したがって、sizeof(array)/sizeof(array[0])を実行して要素数を取得できます。

+2

ジャック、それは "例外"ではありません。渡されたオブジェクト/変数のサイズをバイト単位で計算するだけです。 –

関連する問題