私はC++を初めとしており、fscanfがどのようにメモリをスタックに割り当てるかを調べようとしています。私は単純なファイルから読み込んで行の値を配列に代入するコードを書いています。次に、配列の各要素のアドレスを出力しようとします。C++では、fscanfはどのようにメモリアドレスを割り当てますか?
values = (double *)calloc(rows*columns, sizeof(double));
for (i = 0; i < rows; i++){
for (j = 0; j < columns; j++){
fscanf(input, "%s", buffer);
values[i*columns + j] = atof(buffer);
}
}
v = values;
for (i = 0; i < rows; i++){
for (j = 0; j < columns; j++){
printf("at [%d, %d] value %g\n", i, j, values[i*columns + j]);
printf(" address is 0x%x also 0x%x\n", &values[i*columns + j],
values + i*columns + j);
printf("*v is = %g and v = 0x%x \n\n", *v, v);
++v; /* increment v by 1*/
}
}
入力エントリ1 2 4
と1×3の行列(ベクトル)と.txtファイルであると仮定する。私は次の結果を得る。
at [0, 0] value 1 address is 0xb51600 also 0xb51600 *v is = 1 and v = 0xb51600
at [0, 1] value 2 address is 0xb51608 also 0xb51608 *v is = 2 and v = 0xb51608
at [0, 2] value 4 address is 0xb51610 also 0xb51610 *v is = 4 and v = 0xb51610
私が理解できないことは、それが唯一の2でジャンプしながらアドレスは、[0,1]に[0,0]から8でジャンプ事実であります[0,1]から[0,2]まで。 C++の本から読んだところによると、配列が宣言された型のサイズだけアドレスを増やすべきだと私は考えました。誰もがこの問題にいくつかの洞察を提供することができますか?
おかげ
fscanfは 'buffer'を読み込みます。その宣言は表示されません。変更したり、何かを割り当てたりするのではなく、すでにバッファに空きがあるだけです。しかし、なぜ文字列から二重スキャンし、配列に格納されていると思うのですか?文字列のアドレスにいくらかの接続を維持しますか? – Useless
アドレスの出力は16進数です。アドレスは毎回8ずつ増えます(16進数では「8 + 8 = 10」) – vu1p3n0x
@ vu1p3n0x私はそれを完全に逃しました。私はそのような間違いを見守っています。ありがとう。 – Astaboom