2016-10-05 7 views
0

私は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++の本から読んだところによると、配列が宣言された型のサイズだけアドレスを増やすべきだと私は考えました。誰もがこの問題にいくつかの洞察を提供することができますか?

おかげ

+1

fscanfは 'buffer'を読み込みます。その宣言は表示されません。変更したり、何かを割り当てたりするのではなく、すでにバッファに空きがあるだけです。しかし、なぜ文字列から二重スキャンし、配列に格納されていると思うのですか?文字列のアドレスにいくらかの接続を維持しますか? – Useless

+1

アドレスの出力は16進数です。アドレスは毎回8ずつ増えます(16進数では「8 + 8 = 10」) – vu1p3n0x

+0

@ vu1p3n0x私はそれを完全に逃しました。私はそのような間違いを見守っています。ありがとう。 – Astaboom

答えて

2

それだけに[0,1]から2でジャンプしながら、私が理解することはできませんが、アドレスが[0,1]に[0,0]から8でジャンプ事実です[ 0,2]である。

いいえ、それはこのヘクスで、覚えておいてください8

の他のジャンプです!

0x10 - 0x08 = 0x08 
    16 - 8 = 8 
0

アドレスがHEXのために[0,1]から[0,2]に8ずつジャンプします。

0xb51608 - > 0xb51609 - > 0xb5160A - > 0xb5160B - > 0xb5160C - > 0xb5160D - > 0xb5160E - > 0xb5160F - > 0xb51610あなたは、たとえばPythonの経由HEX演算を高速に再生することができます

$ python -c 'print 0xb51610 - 0xb51608' 
8 
関連する問題