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