malloc将相同的内存位置分配给2个指针

Joh*_*aul 2 c malloc pointers memory-management

在编写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**
Run Code Online (Sandbox Code Playgroud)

我用来分配内存的代码是

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));
}
Run Code Online (Sandbox Code Playgroud)

M.M*_*M.M 9

y块完全x位于内存块之前.没有重叠.

但是,您的循环将从y块末尾的地址打印到y列中.

特别:

int *y = (int *)malloc(4*(DG_SIZE+2)*sizeof(int));
Run Code Online (Sandbox Code Playgroud)

已分配36整型,因为DG_SIZE7(根据你的输出).

但是你a从循环07输出(y + a*DG_SIZE + 0).何时a == 6,这给出了y + 42超出所分配的36个整数的结尾.

我想你的意思是输出y + a*4,而不是y + a*DG_SIZE.