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

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

可以使用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;
}

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值