我是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*/
    }
}


假设输入是一个带有1x3矩阵(向量)的.txt文件,其条目为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

关于c++ - 在C++中,fscanf如何分配内存地址?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39873273/

10-11 22:07
查看更多