Я новичок в C++ и пытаюсь выяснить, как fscanf выделяет память в стек. Я написал фрагмент кода, который читается из простого файла и присваивает значения строк массиву. Затем я пытаюсь распечатать адрес каждого из элементов массива.В 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*/
}
}
Пусть вход представляет собой файл .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
То, что я не могу понять, является тот факт, адрес перескакивает на 8 из [0,0] до [0,1], в то время как он прыгает только 2 от [0,1] до [0,2]. Согласно тому, что я читал из книг на C++, я думал, что адрес должен увеличиваться на размер типа, объявленного массивом. Может ли кто-нибудь дать представление об этом?
Благодаря
fscanf читает в 'buffer', декларация которого вы не показываете. Он не меняет или ничего не выделяет, он просто требует, чтобы буфер имел пространство уже. Но почему, по вашему мнению, двойное сканирование из строки и сохранение в массиве, будет содержать некоторое соединение с адресом строки? – Useless
Ваш вывод для адресов в шестнадцатеричном формате. адреса увеличиваются на 8 каждый раз ('8 + 8 = 10' в шестнадцатеричном формате) – vu1p3n0x
@ vu1p3n0x Я полностью пропустил это. Я постараюсь следить за такими ошибками. Благодарю. – Astaboom