malloc 将相同的内存位置分配给 2 个指针
malloc allocating the same memory location to 2 pointers
在编写 c
代码时,我注意到当我更改与指针 x 指向的内存位置关联的值时,它会导致指针 y 指向的数据值发生变化。
当我再次检查时,我发现 malloc
正在为 2 个不同的指针分配重叠的内存区域。为什么会这样??
我的代码中有很多动态分配的变量。那么是不是因为malloc
可以分配的最大内存量有限制?
以下是我的代码的输出。从输出中您可以看到 malloc
将重叠的内存区域分配给 x 和 y。
size x:32 y:144 //total size allocated to x and y by malloc
//the memory locations allocated to each of the pointers
location x:0x7fb552c04d20 y:0x7fb552c04c70
location x:0x7fb552c04d24 y:0x7fb552c04c8c
location x:0x7fb552c04d28 y:0x7fb552c04ca8
location x:0x7fb552c04d2c y:0x7fb552c04cc4
location x:0x7fb552c04d30 y:0x7fb552c04ce0
location x:**0x7fb552c04d34** y:0x7fb552c04cfc
location x:0x7fb552c04d38 y:0x7fb552c04d18
location x:0x7fb552c04d3c y:**0x7fb552c04d34**
我用于分配内存的代码是
int *x = (int *)malloc((DG_SIZE+1)*sizeof(int));
int *y = (int *)malloc(4*(DG_SIZE+2)*sizeof(int));
printf("\n size x:%d y:%d\n", (DG_SIZE+1)*sizeof(int), 4*(DG_SIZE+2)*sizeof(int));
int a = 0;
for(a = 0; a <= DG_SIZE; a++){
printf("\n location x:%p y:%p\n",(x + a), (y + a*DG_SIZE + 0));
}
y
块在内存中完全在x
块之前。没有重叠。
然而,您的循环打印出 y
块末尾以外的地址,进入 y
列。
具体来说:
int *y = (int *)malloc(4*(DG_SIZE+2)*sizeof(int));
分配了 36
个整数,因为 DG_SIZE
是 7
(根据您的输出)。
但是然后你从 0
循环 a
到 7
并输出 (y + a*DG_SIZE + 0)
。当 a == 6
时,这给出了 y + 42
,它超出了分配的 36 个整数的末尾。
我猜你是想输出 y + a*4
,而不是 y + a*DG_SIZE
。
在编写 c
代码时,我注意到当我更改与指针 x 指向的内存位置关联的值时,它会导致指针 y 指向的数据值发生变化。
当我再次检查时,我发现 malloc
正在为 2 个不同的指针分配重叠的内存区域。为什么会这样??
我的代码中有很多动态分配的变量。那么是不是因为malloc
可以分配的最大内存量有限制?
以下是我的代码的输出。从输出中您可以看到 malloc
将重叠的内存区域分配给 x 和 y。
size x:32 y:144 //total size allocated to x and y by malloc
//the memory locations allocated to each of the pointers
location x:0x7fb552c04d20 y:0x7fb552c04c70
location x:0x7fb552c04d24 y:0x7fb552c04c8c
location x:0x7fb552c04d28 y:0x7fb552c04ca8
location x:0x7fb552c04d2c y:0x7fb552c04cc4
location x:0x7fb552c04d30 y:0x7fb552c04ce0
location x:**0x7fb552c04d34** y:0x7fb552c04cfc
location x:0x7fb552c04d38 y:0x7fb552c04d18
location x:0x7fb552c04d3c y:**0x7fb552c04d34**
我用于分配内存的代码是
int *x = (int *)malloc((DG_SIZE+1)*sizeof(int));
int *y = (int *)malloc(4*(DG_SIZE+2)*sizeof(int));
printf("\n size x:%d y:%d\n", (DG_SIZE+1)*sizeof(int), 4*(DG_SIZE+2)*sizeof(int));
int a = 0;
for(a = 0; a <= DG_SIZE; a++){
printf("\n location x:%p y:%p\n",(x + a), (y + a*DG_SIZE + 0));
}
y
块在内存中完全在x
块之前。没有重叠。
然而,您的循环打印出 y
块末尾以外的地址,进入 y
列。
具体来说:
int *y = (int *)malloc(4*(DG_SIZE+2)*sizeof(int));
分配了 36
个整数,因为 DG_SIZE
是 7
(根据您的输出)。
但是然后你从 0
循环 a
到 7
并输出 (y + a*DG_SIZE + 0)
。当 a == 6
时,这给出了 y + 42
,它超出了分配的 36 个整数的末尾。
我猜你是想输出 y + a*4
,而不是 y + a*DG_SIZE
。