为什么内存地址在Ubuntu中而不是Redhat中发生变化

我有这个程序:

double t;
main() {
}

在Ubuntu上,我运行:

% gdb a.out
(gdb) p &t
$1 = (double *) 0x4010 <t>
(gdb) run
Starting program: /home/phan/a.out 
[Inferior 1 (process 95930) exited normally]
(gdb) p &t
$2 = (double *) 0x555555558010 <t>

为什么地址从0x4010更改为0x555555558010。有办法防止这种情况吗? 在Redhat上,它不会这样做:

% gdb a.out
(gdb) p &t
$1 = (double *) 0x601038 <t>
(gdb) r
Starting program: /home/phan/a.out 
[Inferior 1 (process 23337) exited normally]
(gdb) p &t
$2 = (double *) 0x601038 <t>

顺便说一句,这仅发生在Ubuntu 18.04中。在Ubuntu 16.04中,它的工作原理与Redhat完全相同,即地址前后都相同。