[英]Program using dynamic memory allocation
我在 C 中有以下程序。 p[0][0]
是怎么变成 1 的? 有人可以帮助理解吗?
#include <stdio.h>
#include<stdlib.h>
main()
{
int i,j;
int **p=(int **)malloc(2 * sizeof(int *));
p[0]=(int*) malloc(2*sizeof(int));
p[1]=p[0];
for(i=0;i<2;i++)
for(j=0;j<2;j++)
{
p[i][j]=i+j;
printf("%d,%d,%d",i,j,p[i][j]);
printf("\n");
}
printf("%d,%d,%d",i,j,p[0][0]);
}
output 如下
0,0,0
0,1,1
1,0,1
1,1,2
2,2,1
相同的指针分配给p[0]
和p[1]
。 这意味着p[0]
和p[1]
指向同一个数组。 因此,通过p[1]
完成的更新也可以通过p[0]
看到。
在外部for
循环的第二次迭代中,将1
分配给p[1][0]
。 这使得p[0][0]
为1
。
在以下代码行之后:
int **p=(int **)malloc(2 * sizeof(int *));
p[0]=(int*) malloc(2*sizeof(int));
p[1]=p[0];
这就是 memory 中的内容:
int ** int * int
+---+ +---+ +---+
p: | | ------> | | p[0] -+-> | | p[0][0], p[1][0]
+---+ +---+ | +---+
| | p[1] -+ | | p[0][1], p[1][1]
+---+ +---+
p[0]
和p[1]
指向同一个 2 元素数组,因此您写入p[0][i]
的任何内容都会反映在p[1][i]
中,反之亦然。
你可能打算做的是
int **p = malloc( 2 * sizeof *p ); // cast not necessary, sizeof *p == sizeof (int *)
p[0] = malloc( 2 * sizeof *p[0] );
p[1] = malloc( 2 * sizeof *p[1] );
这会给你
int ** int * int
+---+ +---+ +---+
p: | | ------> | | p[0] ----> | | p[0][0]
+---+ +---+ +---+
| | p[1] --+ | | p[0][1]
+---+ | +---+
|
| +---+
+-> | | p[1][0]
+---+
| | p[1][1]
+---+
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.