注册 登录
编程论坛 C++教室

关于数组初始化的问题

tutuxx0011 发布于 2013-11-14 23:33, 518 次点击
#include<iostream>
#include<fstream>
using namespace std;
int main()
{
        int i;
        int v[10000]={2};
        ifstream fin;
        fin.open("D:\\shuju.txt");
      for(i=0;i<1000;i++)
       {
       fin>>v[i];
       cout<<v[i]<<" ";
    //
      }
    return 0;
}
运行之后,为什么后面的数字都是0
而将程序改为
#include<iostream>
#include<fstream>
using namespace std;
int main()
{
        int i;
        int v[10000]={};
        ifstream fin;
        fin.open("D:\\shuju.txt");
      for(i=0;i<1000;i++)
       {
       fin>>v[i];
       cout<<v[i]<<" ";
    //
      }
    return 0;
}

就报错呢?
10 回复
#2
wp2319572013-11-15 08:13
int v[10000]={2};
初始化方式不一样  cb里这句代码只是把第一个元素置〇
#3
yuccn2013-11-15 09:58
int v[10000]={2}; 等价于
int v[10000];
v[0]=2;
v[1]=0;
v[2]=0;
……
v[9999]=0;

这个,学c语言必须知道的
#4
i802862013-11-15 10:53
用循环,不然真要累死的v[10000],用动态数组或者标准容器比较好
#5
yuccn2013-11-15 12:00
回复 4楼 i80286
memset
#6
i802862013-11-15 12:07
回复 5楼 yuccn
受教了,但我看了一下memset的原型:void *memset(void *s, char ch, size_t n),应该不支持int类的数组吧?
#7
wp2319572013-11-15 13:01
好像还真不能
程序代码:
#include <stdio.h>
#include <string.h>

int main()
{

    int v[10];
    char s[10];
    memset(&v[0],5,10);
    memset(&s[0],'5',10);
    for(int i=0; i<10; i++)
    {
      printf("%4d\n",v[i]);
      printf("-------%4c\n",s[i]);
    }
    return 0;
}


#8
rjsp2013-11-15 13:39
std::fill
#9
yuccn2013-11-15 14:07
回复 7楼 wp231957
是的,不支持int数字的填充,原因它是字节为单位的,不是sizeof(int)为单位,
一般用memset 只是用于数组 、结构体的初始化为0

比如 a[100] = { 0 }
实际上编译器也是嵌入了memset 来初始化的,看下反汇编代码就行了

a[100] = {1};
实质上编译器也就是初始化了第一个变量,其他的用memset来填充0 了,
结构体 或者结构体数字 原理也是一样。

    int a[1000] = { 1 }; // 比如看看 这个反汇编,
012813BC  mov         dword ptr [ebp-0FA8h],1   也就是 a[0] = 1
012813C6  push        0F9Ch                     这个就是sizeof(int) * (1000 -1) = 3996 = 0x0F9Ch  
012813CB  push        0  
012813CD  lea         eax,[ebp-0FA4h]            
012813D3  push        eax  
012813D4  call        @ILT+110(_memset) (1281073h)  这个就是memset(&a[1],0, 3996)
012813D9  add         esp,0Ch

[ 本帖最后由 yuccn 于 2013-11-15 14:27 编辑 ]
#10
tutuxx00112013-11-17 21:22
回复 2楼 wp231957
恩,这个我知道。
可是  int v[100]={};
报错是为什么呢?
#11
yuccn2013-11-18 08:02
可是  int v[100]={};

你既然初始化它,你总的给他一个初始化的值吧。当然会报错啦。不想初始化就这样写行了int v[100];
1