c++数组初始化误区

看下面的一段代码:

int statusArr[100] = {1}

能达到全都初始化为1的结果么?

结果是只有第一个元素初始化了为1,其他都是0.

之前经常写

int a[100]= {0}

这么写可以,为什么?

因为c++有个基本的语法规则,数组初始化列表中的元素个数小于指定的数组长度时,不足的元素补以默认值。当我们写0没有问题因为恰好0是int的默认值罢了。

string a[5] = { "foo", "", "", "", "" };

即后面4个元素调用了string的默认构造函数进行的初始化,而第一个则调用的string::string(const char*)进行的初始化。

还有一个区别:

int a[5];
string a[5];

如果不明确指出初始化列表,那么基本类型是不会被初始化的(除全局变量和静态变量外),所有的内存都是“脏的”;而类类型则会为每个元素调用默认构造函数进行初始化。

注意,在C++11中中间的赋值号可以省略,即 int a[5]{1}; 并且,如果初始化列表为空,如 int a[5]{};,那将初始化所有元素为默认值,即与 int a[5]{0}; 等价

所以当你想在c++对数组赋初值时用正规方法memset.另外注意memset函数原型虽然是:

void *memset(void *s, int ch, size_t n);

但是memset只会取int ch的后8位,也就是一个byte.

错过了初始化时机(memset的误区)
如果想在数组创建结束后再对其进行初始化,可以使用C函数memset(),但是memset的使用有个大问题,就是它只对char类型的数组管用:
char a[10];

memset(a, 1, 10); // 将每个元素设置为1

如果将上面的a数组换成int或其他类型的,就会出现问题,因为memset的内部实现是以字节为单位进行赋值的,int 类型大于一个字节(假设是4个),数组内存连续,如果有下面代码:
int a[10];
memset(a, 1, sizeof(a));

将只会对前sizeof(a)即40个字节进行赋值1的操作,即给“前5个int”进行了赋值0x01010101的操作,失之毫厘谬以千里!

原文地址:https://www.cnblogs.com/youxin/p/12250872.html

时间: 2024-08-03 09:20:08

c++数组初始化误区的相关文章

Java之路(四)数组初始化

本文主要讲数组的初始化方法.可变参数列表以及可变参数列表对函数重载的影响. 数组初始化 定义数组的方式: int[] arr1; 或  int arr1[]; 数组初始化 通过上边的定义,我们只是得到了一个数组的引用.这时已经为引用分配了存储空间,但是还没有给数组对象本身分配任何空间.想要给数组对象分配存储空间,必须使用初始化表达式. a.在数组创建的地方进行初始化,如: int[] arr1 = {1,2,3,4,5}; 这种方式等价于使用new来进行存储空间分配. b.给数组的引用赋值,如:

C++中数组初始化

#include<iostream>using std::cout;using std::endl;int arr1[5];int arr2[5] = {1,3,5};int main(){int arr3[5];int arr4[5] = {2,4,6};int *pi1 = new int[5];int *pi2 = new int[5]();for(int i = 0; i != 5; i++)   cout << arr1[i] << " "

编程题:实现一维数组初始化的几种形式。

#include<stdio.h> void main() { int n; int a[5]={0,1,2,3,4}; int b[5]={1,2}; float c[]={1,2,3,4,5}; for(n=0;n<5;n++) printf("%5d",a[n]); printf("\n"); for(n=0;n<5;n++) printf("%5d",b[n]); printf("\n"); f

一个数组初始化的问题

曾经看到过一个同事写的代码,将一个数组初始化,将它全部初始化为一个指定的值,他采用的是: 1 char a[10]; 2 for(i=0; i<10; i++) 3 { 4 a[i] = 2; 5 } 我的第一想法是何必写这么多代码呢?一个memset不就完事了?并且还自以为是的认为这样做不如memset效率.现在想起觉得自己是多么的傻逼,其实memset就是通过循环实现的.并且memset有其不适用的地方,比如如果数组不是char型呢?显然对于非char型的数组,memset为非0值时就不能适

python多维数组初始化后赋值的问题

当使用下述代码进行数组初始化时 >>>a = [[0]*3]*3 [[0,0,0], [0,0,0], [0,0,0]] >>>a[1][1] = 1 [[0,1,0], [0,1,0], [0,1,0]] >>>b = [[0,0,0],[0,0,0],[0,0,0]] [[0,0,0], [0,0,0], [0,0,0]] >>>b[1][1] = 1 [[0,0,0], [0,1,0], [0,0,0]] 这是因为初始化的问题,

动态数组,数组初始化,数组内存释放,向数组中添加一个元素,向数组中添加多个元素,数组打印,顺序查找,二分查找,查找数组并返回地址,冒泡排序,改变数组中某个元素的值,删除一个数值,删除所有,查找含有

 1定义接口: Num.h #ifndef_NUM_H_ #define_NUM_H_ #include<stdio.h> #include<stdlib.h> /************************************************************************/ /*数组的结构体类型                                                    */ /*******************

Chapter5_初始化与清理_数组初始化与可变参数列表

一.数组初始化 数组是相同类型的,用一个标识符名称封装到一起的一个对象序列或基本类型数据序列.编译器是不允许指定数组的长度的,当使用语句int[] a时,拥有的只是一个符号名,即一个数组的引用,并不拥有这个数组的存储空间.要获取数组的存储空间,必须要写初始化表达式,最朴素的表达式类型如下 1 int[] a = {1,2,3}; 如果在编写程序时,不能确定数组的长度,可以使用如下方式,直接用new在数组里创建元素 1 int[] a = new int[3]; 当创建对象数组时,数组中的元素仅仅

用vector容器代替数组 ——使用数组初始化vector对象

在C++中,我们不能用数组直接初始化另一数组,而只能创建新的数组,然后显式的把原数组的元素逐个复制给新的数组. 按照C语言中的做法: const size_t arry_size=6; int int_arry[arry_size]={0,1,2,3,4,5}; int int_arry2[arry_size]; for(size_t ix=0;ix<arry_size;++i)        int_arry2[ix]=int_arry[i]; 而使用数组初始化vector对象,可以直接利用一

利用函数调用实现数组初始化、逆置和清零

4.创建一个数组, 实现函数init()初始化数组. 实现empty()清空数组. 实现reverse()函数完成数组元素的逆置. 要求:自己设计函数的参数,返回值. #include <stdio.h> //数组变化 void init(int arr[],int len) //数组初始化 { int i=0; int num=0; printf("初始化数组.\n"); for(i=0;i<len;i++) { scanf("%d",&