最全C语言数组初始化方法——可能解决不易找到的bug!

最全C语言数组初始化方法——可能解决不易找到的bug!两段长得相似意义相同的代码 运行结果却不一样 一个正确一个错误

大家好,欢迎来到IT知识分享网。

1.前言

两段长得相似意义相同的代码,运行结果却不一样,一个正确一个错误。实在找不出区别了,打开debug一看,正确的那个book数组没初始化就全为0了,错误那个book数组没初始化则是各种数字都有。(代码见文后)(下图为了方便展示全book数组把大小调成了11)

最全C语言数组初始化方法——可能解决不易找到的bug!

定义改为book[MAX+1]={0}就全初始化为0了:

最全C语言数组初始化方法——可能解决不易找到的bug!

那么接下来看看数组怎么初始化。

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.使用指针和动态内存分配

可以使用malloccalloc函数动态分配数组的内存,并使用指针来访问和初始化数组。

int *arr = (int *)malloc(5 * sizeof(int)); if (arr != NULL) { for (int i = 0; i < 5; i++) { arr[i] = i + 1; } // ... 使用数组 free(arr); // 不要忘记释放内存 }

在使用上述方法时,请确保正确管理内存,避免内存泄漏或其他问题。对于动态分配的内存,一定要在使用完毕后释放它,以防止内存泄漏。同时,注意检查malloccalloc的返回值是否为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; }

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/114715.html

(0)
上一篇 2025-12-07 09:33
下一篇 2025-12-07 10:00

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信