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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 千年的泪 中级黑马   /  2014-5-26 11:09  /  1124 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 千年的泪 于 2014-5-26 12:25 编辑

问题:我想输出数组array中的所有元素,但是为什么输出到2就不再输出了?
输出结果: 1 2
  1. #include <stdio.h>
  2. int printArray(int arr[])
  3. {
  4.         int i;
  5.         for (i = 0; i < sizeof(arr) / sizeof(int); i++)
  6.         {
  7.                 printf(" %d ", arr[i]);
  8.         }
  9.         printf("\n");
  10.         return 0;
  11. }

  12. int main(void)
  13. {
  14.         int array[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
  15.         printArray(array);
  16.         return 0;
  17. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
wanzhu159 + 1

查看全部评分

6 个回复

倒序浏览
不知道楼主着两行打印的是什么?
        printf("sizeof(arr)=%d",sizeof(arr));
        printf("sizeof(int)=%d",sizeof(int));
首先,sizeof(arr)是取的指针的字节数,我的编译器得到的sizeof(arr)等于4,sizeof(int)等于1
回复 使用道具 举报
#include <stdio.h>
int printArray(int arr[])
{
        int i;

                int d = sizeof(arr) ;  /*因为你主函数的数组传递到这个子函数后相当于传递的是指针,也就是地址,所以无论你的数组多长,32位编译系统就是
                                        四个字节,你是64位的所以占8个字节,所以sizeof(arr) / sizeof(int)=8/4=2,所以你只能输出两位 */   
        printf("%d\n",d);

        for (i = 0; i <sizeof(arr) / sizeof(int) ; i++)   //你的这条指令相当于for(i =0;i<2;i++)
        {
                printf(" %d ", arr[i]);
        }
        printf("\n");
        return 0;
}

int main(void)
{
        int array[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
        printArray(array);
        return 0;
}
//解决方法:你可以在主函数内把数组的字节算出来再传到子函数,数组与数组相当于传的指针(地址)

评分

参与人数 1技术分 +1 收起 理由
wanzhu159 + 1

查看全部评分

回复 使用道具 举报
回答:
printArray函数中的arr并不等同于main函数中的array,array是数组而arr是指针;

不管arr怎样写(int * arr或者int arr[]),arr都是个指针,arr负责接收array数组首元素的地址;

当用sizeof(arr)计算arr所占字节数的时候,sizeof计算的不是arr指向的数组所占的字节数,而是计算arr指针自身所占字节数;

在64位环境下,指针占8个字节,int占4个字节,所以sizeof(arr) / sizeof(int) = 8 / 4 = 2;

说道这里就不难看出,程序的输出结果一定只是数组array前两个元素的值。

解决办法就是在调用函数printArray时,直接把在main函数中计算出的数组长度传递进去。

  1. #include <stdio.h>

  2. void printArray(int arr[], int len) // arr接收array数组首元素的地址,len接收array数组的长度
  3. {
  4.         // 在printArray函数中arr是指针,指针占8个字节
  5.         printf("在printArray函数中指针arr所占字节数(sizeof(arr)) = %lu\n", sizeof(arr));
  6.         printf("错误的计算结果:sizeof(arr) / sizeof(int) = %lu / %lu = %lu\n", sizeof(arr), sizeof(int), sizeof(arr) / sizeof(int));

  7.         for (int i = 0; i < len; i++) {
  8.                 printf(" %d ", arr[i]);
  9.         }
  10.         printf("\n");
  11. }

  12. int main(void)
  13. {
  14.         int array[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

  15.         // 在main函数中,数组array所占的字节数为40
  16.         printf("在main函数中数组array所占字节数(sizeof(array)) = %lu\n", sizeof(array));
  17.         printf("sizeof(array) / sizeof(int) = %lu / %lu = %lu\n", sizeof(array), sizeof(int), sizeof(array) / sizeof(int));

  18.         printArray(array, sizeof(array) / sizeof(int)); // 将array数组的地址以及长度都传递给printArray函数

  19.         return 0;
  20. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
wanzhu159 + 1

查看全部评分

回复 使用道具 举报 2 0
论坛的力量不可小视啊!这么快!!!{:3_46:}
回复 使用道具 举报
XCodeRush 发表于 2014-5-26 12:12
回答:
printArray函数中的arr并不等同于main函数中的array,array是数组而arr是指针;

:handshake
回复 使用道具 举报
楼主 加油 !
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马