1.前言
两段长得相似意义相同的代码,运行结果却不一样,一个正确一个错误。实在找不出区别了,打开debug一看,正确的那个book数组没初始化就全为0了,错误那个book数组没初始化则是各种数字都有。(代码见文后)(下图为了方便展示全book数组把大小调成了11)
定义改为book[MAX+1]={0}就全初始化为0了:
那么接下来看看数组怎么初始化。
2.C语言数组初始化
在C语言中,数组可以通过几种方式进行初始化。以下是数组初始化的几种常见方法:
1.静态初始化
当你知道数组的大小和所有元素的值时,可以使用静态初始化。
int arr[5] = {1, 2, 3, 4, 5}; // 创建一个大小为5的整数数组,并初始化 |
如果你只提供了部分值,那么剩下的元素会被初始化为0。
int arr[5] = {1, 2}; // 创建一个大小为5的整数数组,前两个元素为1和2,其余为0 |
2.动态初始化
如果你知道数组的大小,但不知道所有元素的值,可以使用动态初始化。
int arr[5] = {0}; // 创建一个大小为5的整数数组,所有元素都被初始化为0 |
3.字符数组(字符串)
字符数组通常用于存储字符串。
char str[10] = "Hello"; // 创建一个大小为10的字符数组,并初始化为"Hello" |
请注意,字符串的最后一个字符后面有一个\0
作为结束标志。
4. 部分初始化
当数组大小未知,但你知道一些元素的值时,可以使用部分初始化。
int arr[] = {1, 2, 3, 4, 5}; // 创建一个大小为5的整数数组,并初始化 |
在这种情况下,数组的大小由初始化器中的元素数量决定。
5. 混合初始化
你也可以混合使用静态和动态初始化。
int arr[10] = {1, 2, 0, 0, 5}; // 创建一个大小为10的整数数组,并部分初始化 |
当使用数组时,请确保不要超出数组的界限,否则可能会导致未定义的行为。同时,注意初始化数组时提供的值的数量与数组大小之间的关系,以避免不必要的错误。
除了之前提到的静态初始化和动态初始化之外,还有其他几种方法可以用来初始化C语言中的数组。以下是一些其他方法:
6.循环初始化
可以使用循环结构(如for循环)来逐个为数组元素赋值,实现动态初始化。
int arr[5];
for (int i = 0; i < 5; i++) {
arr[i] = i + 1; // 将数组元素初始化为1到5
}
7.memset函数
memset
函数是C标准库中的一个函数,可以用来设置内存区域的值。它通常用于数组或结构体的初始化,也可以用来清空数组或结构体。
int arr[5]; | |
memset(arr, 0, sizeof(arr)); // 将数组所有元素初始化为0 |
memset
函数将arr
数组的起始位置开始的sizeof(arr)
个字节都设置为0
。
8.默认初始化
在C语言中,当数组定义时如果没有明确初始化,数组中的元素将被默认初始化为0(对于全局数组)或包含垃圾值(对于局部变量)。但是,依赖默认初始化通常不是一个好的编程实践,因为它可能会导致未定义的行为。
9.使用函数初始化
可以定义一个函数,该函数负责初始化数组,并在需要的时候调用该函数。
void initializeArray(int arr[], int size) {
for (int i = 0; i < size; i++) {
arr[i] = i + 1;
}
}
int main() {
int arr[5];
initializeArray(arr, 5); // 调用函数初始化数组
// ... 使用数组
return 0;
}
10.使用指针和动态内存分配
可以使用malloc
或calloc
函数动态分配数组的内存,并使用指针来访问和初始化数组。
int *arr = (int *)malloc(5 * sizeof(int));
if (arr != NULL) {
for (int i = 0; i < 5; i++) {
arr[i] = i + 1;
}
// ... 使用数组
free(arr); // 不要忘记释放内存
}
在使用上述方法时,请确保正确管理内存,避免内存泄漏或其他问题。对于动态分配的内存,一定要在使用完毕后释放它,以防止内存泄漏。同时,注意检查malloc
或calloc
的返回值是否为NULL
,以处理内存分配失败的情况。
附录代码
结果正确的:
#include<iostream>
#define MAX 101
using namespace std;
int main(){
int n,m,e[MAX][MAX],que[MAX],book[MAX],cur;
cin>>n>>m;//元素个数和边数
for (int i = 1; i <=n; i++)
for (int j = 1; j <=n; j++)
{
if(i==j)e[i][j]=0;
else e[i][j]=9;
}
int a,b;
for (int i = 1; i <=m; i++){
cin>>a>>b;
e[a][b] = 1;
e[b][a] = 1;
}
//queue
int head=1,tail=1;
que[1]=1;
tail++;
book[1]=1;
while (head<tail&&tail<=n)
{
cur=que[head];
for (int i = 1; i <=n; i++)
{
if(e[cur][i]==1&&book[i]==0)
{
book[i]=1;
que[tail]=i;
tail++;
}
}
if(tail>n)break;
head++;
}
for (int i = 1; i < tail; i++)
{
cout<<que[i]<<" ";
}
return 0;
}
结果错误的:
#include<iostream>
#define MAX 100
using namespace std;
int main(){
int m,book[MAX+1],n,e[MAX+1][MAX+1];
cout<<"enter total line:";
cin >>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++){
if(i==j)e[i][j]=0;
else e[i][j]=9;
}
int a,b;
for(int i=1;i<=m;i++){
cin>>a>>b;
e[a][b]=1;
e[b][a]=1;}
int head=1,tail=1;
int que[MAX+1];
que[1]=1;
tail++;
book[1]=1;//
while(head<tail&&tail<=n){
for(int i=1;i<=n;i++){
if (e[que[head]][i]==1&&book[i]==0)//que[head]
{
book[i]=1;
que[tail]=i;
tail++;
}
}
head++;
}
for(int i=1;i<tail;i++)
cout<<que[i]<<" ";
return 0;
}