我是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
的1x3矩阵(向量)的.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
我无法理解的是地址从[0,0]跳到8 [0,1],而它只从[0,1]跳到2 [0,2]。根据我从C ++书籍中读到的内容,我认为地址应该按照声明数组的类型的大小递增。任何人都可以对此事提供一些见解吗?
由于
答案 0 :(得分:1)
我无法理解的是地址从[0,0]跳到8 [0,1],而它只从[0,1]跳到2 [0,2]。
不,那是8的另一次跳跃。
请记住,这是十六进制!
0x10 - 0x08 = 0x08
16 - 8 = 8
答案 1 :(得分:0)
由于HEX,地址从[0,1]到[0,2]跳跃8。
0xb51608 - &gt; 0xb51609 - &gt; 0xb5160A - &gt; 0xb5160B - &gt; 0xb5160C - &gt; 0xb5160D - &gt; 0xb5160E - &gt; 0xb5160F - &gt; 0xb51610
你可以通过Python快速使用HEX算法,例如:
$ python -c 'print 0xb51610 - 0xb51608'
8