Разница между неподписанным длинным длинным и неподписанным длинным длинным *
У меня странная ошибка памяти.
Код прост:
void *to = calloc(2, sizeof(uint64_t));
...
int add_symbol_to_symbol(void *from, void *to) {
uintptr_t *fromSymbol;
uintptr_t *toSymbol;
uint64_t i;
fromSymbol = (uintptr_t*) from;
toSymbol = (uintptr_t*) to;
for (i = 0; i < 2; i++)
{
*toSymbol ^= *fromSymbol;
toSymbol++;
fromSymbol++;
}
return 0;
}
Когда я отлаживаю код и распечатываю адреса памяти и значение этой памяти, я вижу, что toSymbol имеет ненулевые значения в своей памяти до того, как произойдет xor... но это зависит от того, как я распечатываю данные,
GDB:
print toSymbol
$21 = (uintptr_t *) 0x650400
(gdb) print (toSymbol+1)
$23 = (uintptr_t *) 0x650408
(gdb) print *(toSymbol)
$25 = 0
(gdb) print *(toSymbol+1)
$24 = 4575657221408423936
(gdb) print *(unsigned long long)(toSymbol+1)
$26 = 0
(gdb) print *(unsigned long long*)(toSymbol+1)
$27 = 4575657221408423936
print *(uintptr_t*)(0x650408)
$30 = 4575657221408423936
(gdb) print *(uintptr_t)(0x650408)
$31 = 0
Итак, мои вопросы:
- Почему print (uintptr_t) (0x650408) отображает данные мусора?
- Почему print *(uintptr)(0x650408) показывает ноль? (То есть, почему преобразование 64-битного шестнадцатеричного адреса в 64-битное значение вместо 64-битного адреса вообще ничего не меняет!?!)