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,其余为02.动态初始化

如果你知道数组的大小,但不知道所有元素的值,可以使用动态初始化。

int arr[5] = {0}; // 创建一个大小为5的整数数组,所有元素都被初始化为03.字符数组(字符串)

字符数组通常用于存储字符串。

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)); // 将数组所有元素初始化为0memset函数将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

#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

{

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<

}

return 0;

}

结果错误的:

#include

#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

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

cout<

return 0;

}