首页
社区
课程
招聘
[求助]关于C++静态数组初始值的问题。
发表于: 2014-2-28 12:56 11711

[求助]关于C++静态数组初始值的问题。

bxc 活跃值
6
2014-2-28 12:56
11711
在C++中定义一个int数组,有没有什么办法用一个值初始全部元素?
int ia[10] = { 10 };
这样的的话就只有第一个元素是10。除了用for赋值,还有什么办法么?

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (27)
雪    币: 185
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
int ia[10] = {10,10,10,10,10,10,10,10,10,10}

或者是int ia[10] = {0};   //全部是0
2014-2-28 13:01
0
雪    币: 2210
活跃值: (12)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
memset可以的吧?
2014-2-28 13:01
0
雪    币: 185
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
memset(ia, *, 10);//
2014-2-28 13:02
0
雪    币: 129
活跃值: (2753)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
2楼正解
2014-2-28 13:04
0
雪    币: 2210
活跃值: (12)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
memset(ia,10,10);
2014-2-28 13:12
0
雪    币: 7048
活跃值: (3527)
能力值: ( LV12,RANK:340 )
在线值:
发帖
回帖
粉丝
7
[QUOTE=whnet;1264474]int ia[10] = {10,10,10,10,10,10,10,10,10,10}

或者是int ia[10] = {0};   //全部是0[/QUOTE]

这种的数组小还可以,大的话得写一堆代码。
2014-2-28 14:33
0
雪    币: 185
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
你没看到我第二句么。 写一个0就行了。 全部初始化为0了。
2014-2-28 14:53
0
雪    币: 7048
活跃值: (3527)
能力值: ( LV12,RANK:340 )
在线值:
发帖
回帖
粉丝
9
你的第二句直接写成int ia[10];就行了,C++自动初始化值就是0。
我想要初始化为其它的值,一般要写的数组有几百上千。
不想一个一个定义,也不想for memset复制。
有没有办法修改默认初始值为别的值。
2014-2-28 15:17
0
雪    币: 185
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
[QUOTE=bxc;1264510]你的第二句直接写成int ia[10];就行了,C++自动初始化值就是0。
我想要初始化为其它的值,一般要写的数组有几百上千。
不想一个一个定义,也不想for memset复制。
有没有办法修改默认初始值为别的值。[/QUOTE]

int main(int argc, char **argv){

        int a[10];

        printf("a1:%x, a2:%x\n",a[1], a[2]);

        getchar();
}

你去试试这个代码跑出来的效果。 看看是不是自动化初始化为0了。

这也不想那也不想。  那只能换语言了
2014-2-28 15:22
0
雪    币: 7048
活跃值: (3527)
能力值: ( LV12,RANK:340 )
在线值:
发帖
回帖
粉丝
11
[QUOTE=whnet;1264511]int main(int argc, char **argv){

        int a[10];

        printf("a1:%x, a2:%x\n",a[1], a[2]);

        getchar();
}

你去试试这个代码跑出来的效果。 看看是不是自动化初始化为0了。
...[/QUOTE]

你把数组定义在栈上,怎么可能会初始化。我说的是在代码域外定义的。
存储在.data段中的。

#include "stdafx.h"

int iarr[10];

int _tmain(int argc, _TCHAR* argv[])
{
  int ibrr[10];

  printf("%08X\n", iarr[1]);
  printf("%08X\n", ibrr[1]);
  getchar();
	return 0;
}
2014-2-28 16:19
0
雪    币: 209
活跃值: (143)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
就算有一种语法能够让整数数组全部初始化为某非零值,那么在编译器层面也会通过某种手段来实现这种机制。

1、对于0、-1等每一字节都相同的数字来说,可以memset

2、对于其他数字来说,可以编码在可执行文件中,程序启动时映射过来

3、最后就是程序自动用循环来赋值

因此就算编码者省事,编译器也不省事,做出来的程序执行的过程和编码者自己写for是一样的----根本的原因是没有这种硬件指令可以直接实现,只能软实现。
2014-2-28 16:20
0
雪    币: 7048
活跃值: (3527)
能力值: ( LV12,RANK:340 )
在线值:
发帖
回帖
粉丝
13
我的意思是代码域外的静态数组,就是存储在.data段中的。必须有初始化值的数组。没初始值就是0的。
2014-2-28 16:22
0
雪    币: 10
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
可以用 memset
2014-2-28 16:32
0
雪    币: 80
活跃值: (109)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
15
int  a[100];
int  b = 10;
memset(a, b, 100);
2014-2-28 19:22
0
雪    币: 209
活跃值: (143)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
[QUOTE=sunnysab;1264575]int  a[100];
int  b = 10;
memset(a, b, 100);[/QUOTE]

这样做的结果a里面不是10,而是很大的数字。

memset支持按字节设定值,而非四字节。
2014-3-1 07:31
0
雪    币: 80
活跃值: (109)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
17
我试试看
2014-3-1 16:04
0
雪    币: 7048
活跃值: (3527)
能力值: ( LV12,RANK:340 )
在线值:
发帖
回帖
粉丝
18
不用试了,因为X86中不能push 1字节,所以Byte一般会被扩展成int
2014-3-1 21:01
0
雪    币: 724
活跃值: (81)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
19
可以用宏吧
#define REP1(x) x
#define REP2(x) x,x
#define REP3(x) x,x,x
#define REP4(x) x,x,x,x
#define REP5(x) x,x,x,x,x
#define REP6(x) x,x,x,x,x,x
#define REP7(x) x,x,x,x,x,x,x
#define REP8(x) x,x,x,x,x,x,x,x
#define REP9(x) x,x,x,x,x,x,x,x,x
#define REP10(x) x,x,x,x,x,x,x,x,x,x

定义235个元素的数组,初始化为20:
int abc[]={REP2(REP10(REP10(20))),REP3(REP10(20)),REP5(20)};
2014-3-4 21:02
0
雪    币: 7048
活跃值: (3527)
能力值: ( LV12,RANK:340 )
在线值:
发帖
回帖
粉丝
20
好主意
2014-3-5 00:39
0
雪    币: 52
活跃值: (27)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
不行吧,仔细看看,发现这样少“,”,并且这样构造宏麻烦,比如1234,更大的更不好搞了
2014-3-5 19:09
0
雪    币: 0
活跃值: (954)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
22
mov eax,[ebp-4]
xor  eax,eax
2014-3-5 20:18
0
雪    币: 0
活跃值: (954)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
23
在内存中一般都是4字节对齐的,数组的话一般用到esp-X数,根据你的数组分配的堆栈来大小来决定的。
比如

char a[10]={0};

[esp-0xA] ==相当于你数组开辟了0xA大小的空间
2014-3-5 20:20
0
雪    币: 7048
活跃值: (3527)
能力值: ( LV12,RANK:340 )
在线值:
发帖
回帖
粉丝
24
[QUOTE=网络游侠;1265766]在内存中一般都是4字节对齐的,数组的话一般用到esp-X数,根据你的数组分配的堆栈来大小来决定的。
比如

char a[10]={0};

[esp-0xA] ==相当于你数组开辟了0xA大小的空间[/QUOTE]

不是在栈上的数组
2014-3-5 20:50
0
雪    币: 1104
活跃值: (762)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
int  a[100];
ZeroMemory(a,100);
2014-3-5 22:10
0
游客
登录 | 注册 方可回帖
返回
//