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

In C++, how does fscanf allocate memory address?

本文关键字:分配 内存 地址 何分配 c++ fscanf      更新时间:2023-10-16

我是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 %gn", i, j, values[i*columns + j]);
        printf("  address is 0x%x also 0x%xn", &values[i*columns + j], 
            values + i*columns + j);
        printf("*v is = %g and v = 0x%x nn", *v, v);
        ++v; /* increment v by 1*/
    }
}

假设输入是一个.txt文件,包含一个1x3矩阵(向量),条目为1 2 4。我得到以下结果:

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]跳到[0,1]跳了8,而它从[0,1]跳到[0,2]只跳了2。根据我从c++书籍中读到的,我认为地址应该按声明的数组类型的大小递增。有人能对这件事提供一些见解吗?

谢谢

我不能理解的是地址从[0,0]跳到[0,1]跳了8,而从[0,1]跳到[0,2]只跳了2。

不,那是另一个8。

记住,这是十六进制!

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

地址从[0,1]跳到[0,2]也因为HEX。

0xb51608 -> 0xb51609 -> 0xb5160A -> 0xb5160B -> 0xb5160C -> 0xb5160D -> 0xb5160E -> 0xb5160F -> 0xb51610

你可以通过Python快速使用HEX算法,例如:

$ python -c 'print 0xb51610 - 0xb51608'
8