
展开全部
这里,楼主肯定知道*和++符号的优先级关系,要不也不敢写成*p++。
这里*p++的确等价于*(p++),因为,++的优先级要比*的高。
当然,这个优先级问题,不是楼主问题的重点。
不过区别一下两句
*(p++) = (pp + i * row);
*(p + i) = (pp + i * row);
能看到第一句的指针做着自加的运算,而后取自加后的地址进行赋值。
而第二句的则是首地址加偏移量,然后赋值。
当然,如果只是做赋值操作,这两句完全可以说是等价的。
但是,在楼主的程序里面,这个p的指针则是要作为返回值的。
自加之后的指针,也就是做了*p++操作后的的首地址,自然已经变成自加之后的了。
而做*(p+i)后,p指针的首地址并没有发生变化。
所以,在返回的时候,*p++的地址已经不是我们所期望的了。
程序会在main函数里面奔溃,也就是在程序第37行。(当使用*p++)
回答完楼主的问题,我再来完善一下楼主的程序:
在第46行,的freep()这个函数没有见过……
估计应该是free()吧。
如果是free()那就不能放在这里,而是放在if(p){}的程序块中,否则会引起重复释放的错误。
参考我下面的代码:
...
int main() {
int **p = malloc2d(2, 2);
int i = 0;
int j = 0;
if (p) {
for (i = 0; i < 2; i++){
for (j = 0; j < 2; j++){
*(*(p + ) + j) = 1;
}
}
for (i = 0; i < 2; i++){
for (j = 0; j < 2; j++){
printf("%d\n", *(*(p + i) + j));
}
}
free(p);
}
else // 当p为NULL时,就没有必要释放了。
printf("error\n");
return 0;
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询