私はユーザ入力を読み込み、それを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ですか?
ポインタが配列ではありません!そしてそれはとにかくCの仕組みではありません。動的長さの配列はCにありません。すべての型は静的に宣言されています。 'realloc'はメモリブロックの大きさを変更します(' malloc'はそれを割り当てます)。 – Olaf
'sizeof()'はコンパイル時にのみ動作し、実行時には動作しません。指定されたオブジェクト/変数のサイズを決定します。 –
@Olaf: "Cに動的長さの配列はありません" VLA(可変長配列)はもちろんありますが、各VLAオブジェクトのサイズは実行時に固定されています。この言葉は、OPが求めていることとは関係ありません。 –