免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3551 | 回复: 16
打印 上一主题 下一主题

有个关于指针的小程序,挺迷惑不解的,请高手帮看看! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-07-20 17:22 |只看该作者 |倒序浏览
#include <stdio.h>

int ctr;
short  array_s[10];
float  array_f[10];
double array_d[10];

int main(void)
{
  printf("\t\t Short\t\tFloat\t\tDouble");
  printf("\n============================================================");

  for(ctr=0; ctr < 10; ctr++)
    printf("\n Element %d:\t%ld\t%ld\t%ld",ctr,&array_s[ctr],&array_f[ctr],&array_d[ctr]);
  
  
  printf("\n============================================================\n");
  printf("array_s[0]'s address is: %ld \t Vaule is:%d \n",array_s, *array_s);
  printf("array_f[0]'s address is: %ld \t Vaule is:%d \n",array_f, *array_f);
  printf("array_d[0]'s address is: %ld \t Vaule is:%d \n",array_d, *array_d);

  printf("\n============================================================\n");
  printf("array_s[0]=%d \t address is: %ld \n",*array_s, array_s);
  printf("array_f[0]=%d \t address is: %ld \n",*array_f, array_f);
  printf("array_d[0]=%d \t address is: %ld \n",*array_d, array_d);
  printf("\n============================================================\n");
  

for(ctr=0; ctr<10; ctr++)
  printf("array_f[%d]=%d \n",ctr,array_f+ctr);  


  return 0;
}


大家编译后试试,我在是红旗Linux DC 5.1操作系统上编译的,打印出来的array_f和d的内存地址不对,为"0",但是short的打对了.
结果如下:

                 Short          Float           Double
============================================================
Element 0:     134519176       134519136       134519040
Element 1:     134519178       134519140       134519048
Element 2:     134519180       134519144       134519056
Element 3:     134519182       134519148       134519064
Element 4:     134519184       134519152       134519072
Element 5:     134519186       134519156       134519080
Element 6:     134519188       134519160       134519088
Element 7:     134519190       134519164       134519096
Element 8:     134519192       134519168       134519104
Element 9:     134519194       134519172       134519112
============================================================
array_s[0]'s address is: 134519176       Vaule is:0
array_f[0]'s address is: 134519136       Vaule is:0
array_d[0]'s address is: 134519040       Vaule is:0

============================================================
array_s[0]=0     address is: 134519136
array_f[0]=0     address is: 0                         /*为啥内存地址打出来的是"0"啊? */
array_d[0]=0     address is: 0                        /*为啥内存地址打出来的是"0"啊? */

============================================================
array_f[0]=134519136
array_f[1]=134519140
array_f[2]=134519144
array_f[3]=134519148
array_f[4]=134519152
array_f[5]=134519156
array_f[6]=134519160
array_f[7]=134519164
array_f[8]=134519168
array_f[9]=134519172

论坛徽章:
0
2 [报告]
发表于 2007-07-20 17:28 |只看该作者
赋值了吗

论坛徽章:
0
3 [报告]
发表于 2007-07-20 17:33 |只看该作者
没赋值,默认数组的值是0.

论坛徽章:
0
4 [报告]
发表于 2007-07-20 17:34 |只看该作者
好象是因为前面的"*array_f",不过有点不明白为什么

论坛徽章:
0
5 [报告]
发表于 2007-07-20 17:37 |只看该作者
你试一下printf("%ld,%ld,%ld\n", *array_f, array_f);
输出是0,0, 134519360
呵呵,可能va_list的机制有点问题

论坛徽章:
0
6 [报告]
发表于 2007-07-20 17:41 |只看该作者
需要强制转换吧
printf("array_f[0]=%d \t address is: %ld \n",(int)*array_f, array_f);
  printf("array_d[0]=%d \t address is: %ld \n",(int)*array_d, array_d);

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
7 [报告]
发表于 2007-07-20 17:59 |只看该作者
原帖由 gogaga 于 2007-7-20 17:22 发表
#include

int ctr;
short  array_s[10];
float  array_f[10];
double array_d[10];

int main(void)
{
  printf("\t\t Short\t\tFloat\t\tDouble");
  printf("\n================================ ...

打印格式使用不当造成的,试下如下代码:

  1. #include <stdio.h>

  2. int ctr;
  3. short  array_s[10];
  4. float  array_f[10];
  5. double array_d[10];

  6. int main(void)
  7. {
  8.     printf("\t\t Short\t\tFloat\t\tDouble");
  9.     printf("\n============================================================");

  10.     for(ctr=0; ctr < 10; ctr++)
  11.         printf("\n Element %d:\t%p\t%p\t%p",ctr,&array_s[ctr],&array_f[ctr],&array_d[ctr]);


  12.     printf("\n============================================================\n");
  13.     printf("array_s[0]'s address is: %p \t Vaule is:%.8d \n",array_s, *array_s);
  14.     printf("array_f[0]'s address is: %p \t Vaule is:%f \n",array_f, *array_f);
  15.     printf("array_d[0]'s address is: %p \t Vaule is:%f \n",array_d, *array_d);

  16.     printf("\n============================================================\n");
  17.     printf("array_s[0]=%.8d \t address is: %p \n",*array_s, array_s);
  18.     printf("array_f[0]=%f \t address is: %p \n",*array_f, array_f);
  19.     printf("array_d[0]=%f \t address is: %p \n",*array_d, array_d);
  20.     printf("\n============================================================\n");


  21.     for(ctr=0; ctr<10; ctr++)
  22.         printf("array_f[%d]=%p \n",ctr,array_f+ctr);  


  23.     return 0;
  24. }
复制代码

运行结果如下:
                 Short                Float                Double
============================================================
Element 0:        0x80499c8        0x80499a0        0x8049940
Element 1:        0x80499ca        0x80499a4        0x8049948
Element 2:        0x80499cc        0x80499a8        0x8049950
Element 3:        0x80499ce        0x80499ac        0x8049958
Element 4:        0x80499d0        0x80499b0        0x8049960
Element 5:        0x80499d2        0x80499b4        0x8049968
Element 6:        0x80499d4        0x80499b8        0x8049970
Element 7:        0x80499d6        0x80499bc        0x8049978
Element 8:        0x80499d8        0x80499c0        0x8049980
Element 9:        0x80499da        0x80499c4        0x8049988
============================================================
array_s[0]'s address is: 0x80499c8          Vaule is:00000000
array_f[0]'s address is: 0x80499a0          Vaule is:0.000000
array_d[0]'s address is: 0x8049940          Vaule is:0.000000

============================================================
array_s[0]=00000000          address is: 0x80499c8
array_f[0]=0.000000          address is: 0x80499a0
array_d[0]=0.000000          address is: 0x8049940

============================================================
array_f[0]=0x80499a0
array_f[1]=0x80499a4
array_f[2]=0x80499a8
array_f[3]=0x80499ac
array_f[4]=0x80499b0
array_f[5]=0x80499b4
array_f[6]=0x80499b8
array_f[7]=0x80499bc
array_f[8]=0x80499c0
array_f[9]=0x80499c4

论坛徽章:
0
8 [报告]
发表于 2007-07-20 18:01 |只看该作者
楼上的,你真行,我强制转换之后还真打出内存地址来了,为什么>>>>>???????

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
9 [报告]
发表于 2007-07-20 18:17 |只看该作者
printf 等变长参数的函数当格式参数要求的变量长度和对应变量的长度不匹配时,会造成 printf 取错变量(或者说 stack corrupt),看看变长参数的实现会很有帮助的。

[ 本帖最后由 MMMIX 于 2007-7-20 18:34 编辑 ]

论坛徽章:
0
10 [报告]
发表于 2007-07-20 18:23 |只看该作者
原帖由 pengjay 于 2007-7-20 17:41 发表
需要强制转换吧
printf("array_f[0]=%d \t address is: %ld \n",(int)*array_f, array_f);
  printf("array_d[0]=%d \t address is: %ld \n",(int)*array_d, array_d);

恩 加了之后就对啦 不知道为什么?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP