A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© ZHYU 初级黑马   /  2015-7-28 13:38  /  996 人查看  /  12 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 ZHYU 于 2015-8-13 23:37 编辑


多谢各位朋友的解答,答案已经出来了!
声明变量的时候,是存在栈空间,main函数中,从上往下,变量的地址从大到小,这里打印出了num1和num2的地址;0x
printf("%p\n",&num1);
printf("%p\n",&num2);
0x7fff5fbff79c
0x7fff5fbff798

所以,只需要将*a[0]++  改为,*a[0]--即可!
再次感谢!
========================================================================================

求解:为什么下面的代码打印出来后最后一个值不是3,而是一个很大的数字呢?  

  int num1 =2,num2 = 3;
    int *a[]={&num1,&num2};
    printf("%p=====%d\n",a[0],*a[0]++);
    printf("%p=====%d\n",a[0],*a[0]);

打印结果:
0x7fff5fbff7bc=====2
0x7fff5fbff7c0=====1606416408

12 个回复

倒序浏览
先打印出*a[1]的地址看看,是不是和最后*a[0]的地址相同
回复 使用道具 举报
printf("%p=====%d\n",a[0],*a[0]++);   这句话执行完之后 a[0] 的地址就变了,指向了一个没有值的地方,所以取出来的数很大,其实是空
回复 使用道具 举报
printf("%p=====%d\n",a[0],*a[0]++);执行之后。。。。可以理解为把指针所指向的地址向后移动一位。。。既此时的*a[0]位置修改为*a[1]...这样你要再打印*a[0]时是空值。。。。所取的值是随机的!
回复 使用道具 举报
楼上正解。。。
回复 使用道具 举报
  张恒宇 发表于 2015-7-28 22:10
printf("%p=====%d\n",a[0],*a[0]++);执行之后。。。。可以理解为把指针所指向的地址向后移动一位。。。既 ...

不能这样理解测试结果表明不是向后移动一位。。。。
回复 使用道具 举报
Eil.tea 发表于 2015-7-28 13:56
先打印出*a[1]的地址看看,是不是和最后*a[0]的地址相同

地址改变了。。。不一样的。。。而且当打印a[1]是的数值还是3!这里的*a[0]++到底做了什么操作。。。。。
回复 使用道具 举报
通过思考一段时间个人认为是地址改变导致*a[0]初始化失败。。。。所产生的数可能是系统数据,可能上个程序的数据也可能是垃圾数据。。。。仅供参考
回复 使用道具 举报 1 0
给你个合理的解释,首先num1的地址大于num2的地址。因为我们一直理解定义数组的时候,地址是连续的并且递增的,但是忽略了你这里定义的是指针数组并且为每个指针赋值了,而这个值有恰好是连续的定义的变量,而定义变量的时候先分配的是大的地址,所以你改成 *a[0]--,就能得到你的预期的值了,楼上的同学都说的没错,你*a[0]++指向了一个未知的内存空间,所以会有一个“垃圾数”。
回复 使用道具 举报 1 0
a[0]++因为是先打印后自加  打印出来的是a[0]打印完就变成了a[1],,,a[0]变了 找不到地址就变成乱码了
回复 使用道具 举报
恩恩,懂了
回复 使用道具 举报
香港 发表于 2015-7-29 08:04
a[0]++因为是先打印后自加  打印出来的是a[0]打印完就变成了a[1],,,a[0]变了 找不到地址就变成乱 ...

兄弟,你没亲自编译吧,首先a[0]++后,绝对不是a[1]。
回复 使用道具 举报
学习学习!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马