| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 518 人关注过本帖
标题:关于数组初始化的问题
只看楼主 加入收藏
tutuxx0011
Rank: 1
等 级:新手上路
帖 子:3
专家分:2
注 册:2013-11-14
结帖率:0
收藏
已结贴  问题点数:20 回复次数:10 
关于数组初始化的问题
#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;
}

就报错呢?
搜索更多相关主题的帖子: include return 
2013-11-14 23:33
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:5 
int v[10000]={2};
初始化方式不一样  cb里这句代码只是把第一个元素置〇

DO IT YOURSELF !
2013-11-15 08:13
yuccn
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:何方
等 级:版主
威 望:167
帖 子:6815
专家分:42393
注 册:2010-12-16
收藏
得分:5 
int v[10000]={2}; 等价于
int v[10000];
v[0]=2;
v[1]=0;
v[2]=0;
……
v[9999]=0;

这个,学c语言必须知道的

我行我乐
公众号:逻辑客栈
我的博客:
https://blog.yuccn. net
2013-11-15 09:58
i80286
Rank: 6Rank: 6
等 级:侠之大者
威 望:5
帖 子:99
专家分:428
注 册:2013-9-30
收藏
得分:5 
用循环,不然真要累死的v[10000],用动态数组或者标准容器比较好
2013-11-15 10:53
yuccn
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:何方
等 级:版主
威 望:167
帖 子:6815
专家分:42393
注 册:2010-12-16
收藏
得分:0 
回复 4楼 i80286
memset

我行我乐
公众号:逻辑客栈
我的博客:
https://blog.yuccn. net
2013-11-15 12:00
i80286
Rank: 6Rank: 6
等 级:侠之大者
威 望:5
帖 子:99
专家分:428
注 册:2013-9-30
收藏
得分:0 
回复 5楼 yuccn
受教了,但我看了一下memset的原型:void *memset(void *s, char ch, size_t n),应该不支持int类的数组吧?
2013-11-15 12:07
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
好像还真不能
程序代码:
#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;
}



DO IT YOURSELF !
2013-11-15 13:01
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:5 
std::fill
2013-11-15 13:39
yuccn
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:何方
等 级:版主
威 望:167
帖 子:6815
专家分:42393
注 册:2010-12-16
收藏
得分:0 
回复 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 编辑 ]

我行我乐
公众号:逻辑客栈
我的博客:
https://blog.yuccn. net
2013-11-15 14:07
tutuxx0011
Rank: 1
等 级:新手上路
帖 子:3
专家分:2
注 册:2013-11-14
收藏
得分:0 
回复 2楼 wp231957
恩,这个我知道。
可是  int v[100]={};
报错是为什么呢?
2013-11-17 21:22
快速回复:关于数组初始化的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.024585 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved