Как правильно добавить десятичное целое число в адрес - PullRequest
0 голосов
/ 22 ноября 2018

Я пытаюсь добавить десятичное целое число к адресу.(Я не очень хорошо понимаю адрес, думаю, он работает в шестнадцатеричном формате) следующим образом:

//node_t is a structure with an int and node_t* ptr, so i have the size 8
    int move = sizeof(node_t) + size; //here node_t is 8, size is 10
//so actually i want to move it by 18bytes.
    node_t* tmp = (current)+sizeof(node_t) / sizeof(node_t) + size/sizeof(int)
//current is the starting address, i try to get current moving positively with 18 bytes

Но получается, что tmp всего на 16 байтов больше, чем current.

Мне кажется, проблема в том, что размер распознается как шестнадцатеричный, как я могу решить эту проблему?

1 Ответ

0 голосов
/ 22 ноября 2018

Это не имеет особого смысла:

node_t* tmp = (current)+sizeof(node_t) / sizeof(node_t) + size/sizeof(int)

Арифметика указателей работает путем добавления количества элементов, а не байтов.Кажется, вы пытаетесь позаботиться об этом, разделив размеры, но это не сработает.

Из выражения, которое я предполагаю, current имеет тип node_t*.Добавление sizeof(node_t) / sizeof(node_t) в основном перемещает его за текущую позицию.Вы также можете просто использовать 1 для этой части.

Затем добавьте size/sizeof(int).Здесь вы предполагаете другой размер элементов: int вместо node_t.

Вы упоминаете, что размер node_t равен 8. Как бы вы поделили 10 на 8?10/8 равно 1 с целочисленным делением.Это означает, что вы всегда перемещаетесь на 2 элемента, то есть на 16 байтов.

Вместо этого вы можете попробовать этот уродливый хак:

node_t* tmp = (node_t *)(((char*)current) + sizeof(node_t) + size);

Это может сработать, если у вас нет очень строгих ограничений на выравниваниеаппаратное обеспечение.

В противном случае вам нужно округлить до следующего хорошо выровненного адреса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...