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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© lixiangzhou 中级黑马   /  2014-3-15 23:24  /  1730 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 lixiangzhou 于 2014-3-24 15:11 编辑

下列程序预期输出结果:
44 0 0 99
为什么会输出:
44 1 0 99
求详解~


  1. #include <stdio.h>

  2. int main()
  3. {
  4.     int b = 4;
  5.     int a[b];
  6.     a[0] = 44;
  7.     a[3] = 99;
  8.    
  9.     for (int i = 0; i < sizeof(a) / sizeof(int); i++) {
  10.         printf("%d ", a[i]);
  11.     }
  12.     printf("\n");
  13.     return 0;
  14. }
复制代码



评分

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

查看全部评分

11 个回复

倒序浏览
数组名在当参数传递时,会完全退化为指针
你这样写void num(int a[])和void num(int *a)完全一样
所以,sizeof(a)其实求的是指针的大小,指针大小总是为4个字节的
所以sizeof(a)/sizeof(int)总是为1
可以传递一个参数n,为数组大小

评分

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

查看全部评分

回复 使用道具 举报
#include <stdio.h>

int main()
{
    int b = 4;
    /*
    int a[b];
    a[0] = 44;
    a[3] = 99;
     */
    int a[4] = {[0] = 44,[3] = 99};
    // 数组a没有被初始化,默认情况下,系统随机补值。
    // 初始化过程中,没有的值,系统默认以0补齐。
    for (int i = 0; i < sizeof(a) / sizeof(int); i++) {
        printf("%d ", a[i]);
    }
    printf("\n");
    return 0;
}

评分

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

查看全部评分

回复 使用道具 举报

int main (int argc, const char * argv[]) {
    // insert code here...
    printf("Hello, World!\n");
   
    int b =4;
    int a[b];
    a[0]=44;
    a[3]=99;
   
   printf("%li\n",sizeof(a));
    printf("%li\n",sizeof(int));
    for (int i=0; i<sizeof(a)/sizeof(int); i++) {
        printf("%d\n",a[i]);
    }
    printf("\n");
    return 0;
}
输出结果为:
Hello, World!
16
4
44
32767
3603
99
这说明:数组长度为4,每一个数占用4个字节,;第二个数求的int类型占几个字节,也是4个
由于一开始就对a[0],a[3]进行了附值,所以这两个打印正确;
但是中间两个没有进行附值,不是默认对0;而是随机对。
回复 使用道具 举报
在数组赋值过程中全局,静态变量,一般默认为0;
局部变量在栈上,取决于此处原来的数据,如果不初始化的话;动态变量在堆上.
有时候和用的编译器也有关系
回复 使用道具 举报
本帖最后由 keycola 于 2014-3-16 10:41 编辑

兄台的代码:
#include <stdio.h>

int main()
{
    int b = 4;
    int a;              //不知道兄台用的什么编译器,这里可以通过 ,我的编译器,不可以 a[],[]中应该是const 类形的才可以,我改为 int a[4];  不影响结果
    a[0] = 44;
    a[3] = 99;
   
    for (int i = 0; i < sizeof(a) / sizeof(int); i++) {                  //  sizeof(a) / sizeof(int) 这句的结果就是    i < 4 , 遍历所有开辟了的空间
        printf("%d ", a);
    }
    printf("\n");
    return 0;
}

我电脑中的结果是:44 -858993460 -858993460 99   
44 是  a[0]


-858993460   是  a[1]

-858993460 是 a[2]

99 是  a[3]

a[0] 和   a[3] 都是兄台初始化了的,所以没问题, 由于不是静待变量,所以编译器不会初试化, a[1] , a[2] 中是什么数据,要看 内存中本来的数据了

兄台,想得到  44 0 0 99

可以   把 a[4]  定义在 main函数外,也就是全局变量   或  直接 在前面加 static    如: static  int a[4];

不知道兄台是否明白

评分

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

查看全部评分

回复 使用道具 举报
1.在C语言中,“初始化”和“赋值”是两个不同的概念。楼主问题中应该是“初始化”与“赋值”2个概念的理解问题。
int a = 0; 在声明一个变量的时候指定变量的值,这叫做初始化;
int a; a = 2; 这叫做赋值。
2.如果不对一个数组(非全局的、非静态的)进行初始化,这个和上面的变量未初始化一样,编译器不知道你要做什么,所以懒得浪费时间对它们进行初始化。
如果对一个数组进行部分初始化,形如:
int a[10] = {1, 2, 3};
未被初始化的部分a[3]~a[9]便会被编译器初始化为0。我的理解是,这是编译器认为你只关心数组a中前三个数的值,而后面的编译器为了让你省心就帮你初始化为0了,这时候编译器想“反正你都让我把前三个给填上了数,我也不怕麻烦了,后几个我给你填0吧”,于是编译器很大方地挥一挥衣袖把a[3]~a[9]填为0。
但是:
int a[10];
a[0] = 1;
a[1] = 2;
a[2] = 3;
这个时候a[3]~a[9]的值并不是0.因为这是运行时赋值,这个时候编译器已经下班了,所a[3]~a[9]中的值也是不确定的。

-----------------------
楼主明白了否,你的a【1】和a【2】是随机的
int变量处于运行时堆栈。它的特点:在调用一个函数的过程中,这个函数内部的int变量才存在,当这个函数调用结束时,这些变量所占用的内存即被收回。如果多次调用一个函数,这个函数内部的int变量在内存中的地址是不确定的。由于int变量在内存中的地址不是一成不变的,所以在程序开始前,编译器无法确定它们的值,并不对它们进行初始化。
因此,int变量未被初始化时,编译器也不知道你想要往这个变量里存什么,所以它的值是不确定的,毫无意义的,等着你在运行时给它进行赋值操作。

评分

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

查看全部评分

回复 使用道具 举报
牧之 发表于 2014-3-15 23:39
数组名在当参数传递时,会完全退化为指针
你这样写void num(int a[])和void num(int *a)完全一样
所以,siz ...

谢谢解答,问题已解决
回复 使用道具 举报

谢谢解答,问题已解决
回复 使用道具 举报
apple_victor 发表于 2014-3-16 00:49
int main (int argc, const char * argv[]) {
    // insert code here...
    printf("Hello, World!\n") ...

谢谢解答,问题已解决
回复 使用道具 举报
keycola 发表于 2014-3-16 10:39
兄台的代码:
#include

谢谢解答,问题已解决
回复 使用道具 举报
董月峰 发表于 2014-3-16 10:50
1.在C语言中,“初始化”和“赋值”是两个不同的概念。楼主问题中应该是“初始化”与“赋值”2个概念的理解 ...

谢谢解答,问题已解决
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马