C语言动态分配二维数组问题

下面上图求解。。。... 下面上图

求解。。。
展开
 我来答
枫叶非也
2014-07-22 · 超过34用户采纳过TA的回答
知道答主
回答量:63
采纳率:0%
帮助的人:67.7万
展开全部

这里,楼主肯定知道*和++符号的优先级关系,要不也不敢写成*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;
}
忽忽上升
2014-07-22 · TA获得超过1911个赞
知道小有建树答主
回答量:1166
采纳率:70%
帮助的人:596万
展开全部
p++是一个表达式,不能为左值。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式