2016-10-05 3 views
0

Я новичок в 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++, я думал, что адрес должен увеличиваться на размер типа, объявленного массивом. Может ли кто-нибудь дать представление об этом?

Благодаря

+1

fscanf читает в 'buffer', декларация которого вы не показываете. Он не меняет или ничего не выделяет, он просто требует, чтобы буфер имел пространство уже. Но почему, по вашему мнению, двойное сканирование из строки и сохранение в массиве, будет содержать некоторое соединение с адресом строки? – Useless

+1

Ваш вывод для адресов в шестнадцатеричном формате. адреса увеличиваются на 8 каждый раз ('8 + 8 = 10' в шестнадцатеричном формате) – vu1p3n0x

+0

@ vu1p3n0x Я полностью пропустил это. Я постараюсь следить за такими ошибками. Благодарю. – Astaboom

ответ

2

То, что я не могу понять, является тот факт, адрес перескакивает на 8 из [0,0] до [0,1], в то время как он прыгает только на 2 из [0,1] до [ 0,2].

Нет, это еще один скачок 8.

Помните, что это наговор!

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

Адрес прыгает на 8 от [0,1] до [0,2] также из-за HEX.

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

Вы можете играть быстро с HEX арифметике с помощью Python, например:

$ python -c 'print 0xb51610 - 0xb51608' 
8 
Смежные вопросы