免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: RobinHoo
打印 上一主题 下一主题

[C] <已解决>[求助]被指针彻底弄晕了 [复制链接]

论坛徽章:
0
31 [报告]
发表于 2008-09-05 10:55 |只看该作者
原帖由 RobinHoo 于 2008-9-5 10:41 发表

你的意思是要写成这样?
(int *)(*intArr)=(int *)calloc(10,sizeof(int));
或者
(*intArr)=calloc(10,sizeof(int));


int **intArr;
其中 intArr是一个指向 int指针 的指针
你没有给它赋值 也就是*intArr 是NULL的 是没有空间的 那calloc(10,sizeof(int));的返回值保存在NULL里? 肯定出错

        int *p = &i;
        int **intArr = &p;

这样就可以了
因为*intArr有空间了

不知而说对没有 晕了

论坛徽章:
0
32 [报告]
发表于 2008-09-05 11:02 |只看该作者
额 我的解释应该是正确的
如果没有下面这个初始化过程

int *p = &i;
int **intArr = &p;


*intArr在VC是没有值的VC的watch里*intArr值显示CXX0030:Error:expression cannot be evaluated

如果有这个初始化过程VC的watch里*intArr值是一个地址【0x0012ff7c】

论坛徽章:
0
33 [报告]
发表于 2008-09-05 11:21 |只看该作者
我大概明白了你说的,就是说如果intArr有地址,但是(*intArr)没有地址,所以对(*intArr)free操作是出错。
但是我不这么认为。
我来看这样的的图例
intArr是用来存储一个int指针的指针,这个int指针就是(*intArr),但是刚开始的时候(*intArr)的内容是NULL,就是没有任何内容,或者是随机数。不过calloc为它赋了值,所以从intArr,(*intArr),(**intArr)都是合法的。

论坛徽章:
0
34 [报告]
发表于 2008-09-05 11:25 |只看该作者
这么说吧,如果我们有个int数组
int arrInt[10]
int **intArr
intArr=&arrInt;
那么(*intArr)==arrInt
*(*intArr)==arrInt[0]

free(*intArr)===free(arrInt)
当然在我目前这个例子里不可以这么做。但在我之前的帖子里是可以的

[ 本帖最后由 RobinHoo 于 2008-9-5 11:27 编辑 ]

论坛徽章:
0
35 [报告]
发表于 2008-09-05 11:29 |只看该作者
原帖由 RobinHoo 于 2008-9-5 11:21 发表
我大概明白了你说的,就是说如果intArr有地址,但是(*intArr)没有地址,所以对(*intArr)free操作是出错。
但是我不这么认为。
我来看这样的的图例
intArr是用来存储一个int指针的指针,这个int指针就是(*int ...


不对 是*intArr为NULL 所以你那个赋值语句相当于是(int *)NULL = (int *) calloc(....)

论坛徽章:
0
36 [报告]
发表于 2008-09-05 11:30 |只看该作者
所以得先赋值 让*intArr不是NULL 这样 才能把返回的值保存起来

论坛徽章:
0
37 [报告]
发表于 2008-09-05 11:31 |只看该作者
吃饭了 哈哈回来看你的结果

论坛徽章:
0
38 [报告]
发表于 2008-09-05 11:35 |只看该作者
原帖由 lenky0401 于 2008-9-5 11:30 发表
所以得先赋值 让*intArr不是NULL 这样 才能把返回的值保存起来

那我问你在一般指针申请之前会有这样的代码:

  1. int *p=NULL;
  2. .....
  3. if (p==NULL)
  4. {
  5.            p=(int *) malloc(sizeof(int)*10);
  6.            ....

  7. }
复制代码


这个怎么理解?p==NULL了,然后之后的申请地址放在NULL地址上了?

论坛徽章:
1
申猴
日期:2014-02-11 14:50:31
39 [报告]
发表于 2008-09-05 11:47 |只看该作者
lz的代码明显错了

论坛徽章:
0
40 [报告]
发表于 2008-09-05 11:49 |只看该作者
原帖由 RobinHoo 于 2008-9-5 11:35 发表

那我问你在一般指针申请之前会有这样的代码:

int *p=NULL;
.....
if (p==NULL)
{
           p=(int *) malloc(sizeof(int)*10);
           ....

}


这个怎么理解?p==NULL了,然后之后的申请 ...



你这是一级指针的嘛 它本来就有地址 所以可以用来保存返回值

但是那个二级指针就不同了
在那个二级指针中的一级指针的值(没初始化的话 也就是NULL)用来当二级指针的地址哦 (有点别扭)
你自己仔细想想吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP