关于malloc行为的怪事

来源:百度知道 编辑:UC知道 时间:2024/05/23 19:52:04
一个例子:

int i,j,x;
int **p,**q;
int **m,**n;

p=(int**)malloc(30*sizeof(int *));
m=p;
for(i=0;i <22;i++)
*(p+i)=(int*)malloc(30*sizeof(int));
for(i=0;i <22;i++)
for(j=0;j <22;j++)
*(*(p+i)+j)=1;

q=(int**)malloc(30*sizeof(int *));
n=q;
for(i=0;i <22;i++)
*(q+i)=(int*)malloc(30*sizeof(int));
for(i=0;i <22;i++)
for(j=0;j <22;j++)
*(*(q+i)+j)=1;

for(i=0;i <22;i++)
{
for(j=0;j <22;j++)
printf("%i ",*(*(p+i)+j));
printf("\n");
}

printf("\n\n\n");

for(i=0;i <22;i++)
{
for(j=0;j <22;j++)
printf("%i ",*(*(q+i)+j));
printf(

你的p,q两个二维数组一行与一行之间并不是连续的,这源于你一行一行的分配内存。
而memcmp当然是比较连续的内存块,所以p,q两个数组的整体比较总是不成功。
如果要比,也只能一行一行的比。

另外,你想打m,p所指向的地址,可以用这种方法:
printf("%i %i\n", (int)m, (int)p);

否则你将打印出m,p这两个指针变量在堆栈中的地址。

首先第一个问题,数组为什么用memcmp比较不相等:
malloc是申请一块连续的空间,memcmp也是比较一段连续的空间,但是你的二维数组是多次malloc得到的,意味着每次malloc的空间是连续的,但这些malloc空间之间并不是连续的,所以memcmp比较不了这种离散的空间,你必须按照malloc的顺序和大小,一段一段比较。
第二个问题为什么会有差别,因为你打印的不是m p n q的值,你打印的是这四个变量的地址,虽然他们自己也是指针,但是他们也有自己的存放的地址。如果你打印他们各自的值就不会有差别了