在C ++中,fscanf如何分配内存地址?

时间:2016-10-05 11:55:09

标签: c++ arrays memory

我是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 ++书籍中读到的内容,我认为地址应该按照声明数组的类型的大小递增。任何人都可以对此事提供一些见解吗?

由于

2 个答案:

答案 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