C++中数组不初始化会输出什么结果
在C++中,如果你声明了一个数组但没有对其进行初始化,数组的元素将具有未定义的值。这意味着数组元素的值是不确定的,可能是垃圾值。
当你访问未初始化的数组元素时,可能会得到以下结果:
随机值:未初始化的数组元素可能包含之前内存位置上的任意值,这些值可能是随机的、垃圾的或者是之前存储在该内存位置上的其他数据。
可能发生未定义行为:在C++中,访问未初始化的数组元素属于未定义行为,这意味着程序的行为是不可预测的。它可能导致崩溃、错误的结果或其他意想不到的行为。
为了避免未定义的行为和潜在的问题,最好在使用数组之前对其进行明确的初始化操作,将其元素设置为特定的值或赋予所需的初值。例如,可以使用循环或使用初始化列表在声明数组时进行初始化。
解决办法
动态分配一维数组
malloc-free
#include <iostream>
#include<stdlib.h> //该头文件为malloc必须
using namespace std;
int main()
{
int len;
int *p;
cout<<"请输入开辟动态数组的长度:"<<endl;
cin>>len;
//长度乘以int的正常大小,才是动态开辟的大小
p = (int*)malloc(len*sizeof(int));
cout<<"请逐个输入动态数组成员:"<<endl;
for(int i=0; i<len; ++i)
{
//此处不可以写成:cin>>*p[i]
cin>>p[i];
cout<<p[i]<<" ";
}
//时刻记住:有malloc就要有free
free(p);
}
“new-delete”
#include <iostream>
using namespace std;
int main()
{
int len;
cout<<"请输入开辟数组的长度:"<<endl;
cin>>len;
int *p = new int [len];
//数据输入
for(int i=0; i<len; ++i)
{
cin>>p[i];
cout<<p[i]<<" ";
}
//释放内存:
delete []p;
}
动态分配二维数组
malloc-free
#include <iostream>
#include<stdlib.h> //该头文件为malloc必须
using namespace std;
int main()
{
int row,col;
int **p;
cout<<"请输入开辟动态数组的行 & 列:"<<endl;
cin>>row>>col;
p = (int**)malloc(row*sizeof(int*));//为数组的行开辟空间
for(int i=0; i<row; ++i)
{
*(p+i)=(int*)malloc(col*sizeof(int));//为数组的列开辟空间
}
//输入成员
cout<<"请逐个输入动态数组 各行各列 成员:"<<endl;
for(int i=0; i<row; ++i)
for(int j=0; j<col; ++j)
{
//此处不可以写成:cin>>*p[i] [j]
cin>>p[i][j];
cout<<p[i][j];
}
//时刻记住:有malloc就要有free
for(int i=0; i<row; ++i)
{
free(*(p+i));
}
}
“new-delete”
#include <iostream>
using namespace std;
int main()
{
int row,col;
cout<<"请输入开辟数组的行 & 列:"<<endl;
cin>>row>>col;
//行的开辟
int **p = new int*[row];
for(int i=0; i<row; ++i)
{
//列的开辟
p[i] = new int[col];
}
//数据输入
cout<<"请逐个输入 各行各列 数据:"<<endl;
for(int i=0; i<row; ++i)
for(int j=0; j<col; ++j)
{
cin>>p[i][j];
cout<<p[i][j]<<"";
}
//释放内存
delete []p;
}
memset
memset(a, 0, sizeof(a))就是将数组a的所有元素设置为0。
这个函数常用于对数组、结构体等数据结构进行初始化,或者清空缓存区。在实际使用中,可以根据需要将value设置为不同的值,如0、1、-1等等。
需要注意的是,memset函数只能设置某一个字节的值,不能进行更细粒度的设置。在对非字符类型的数组进行清空时,可能会出现错误的结果,因为memset是按字节进行操作的。
另外,在使用memset时,应该确保不会越界,否则会引发未定义行为。