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

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

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;
}

C语言数组初始化 在C语言中,数组初始化有以下几种方式:  1. 定义的时候同时初始化:     int array[10] = {1,2,3,4,5};  2. 定义的时候不指定数组大小,由初始化数组元素来确定大小:     int array[] = {1,2,3,4,5};  3. 先定义变量,然后初始化. 注意点: 定义变量时必须制定数组的大小. 此时只能对数组变量成员 阅读详情

相关推荐

C语言多维数组初始化

由于剧情,需要C语言实现图像算法。但作为一名MATLAB老用户,根本不知“指针”“内存”为何物。开始自信满满,结果连初始化一个二维全零矩阵都不会(尴尬)。 顾从零学起,在此总结,供跟我一样的选手学习交流。

HPC_ZY 1万+

C语言数组如何初始化

数组是一种在C语言中常用的数据结构,用于存储一系列相同类型的数据。在C语言中,可以使用不同的方法初始化数组。下面将介绍几种常见的数组初始化方式,并给出相应的源代码示例。这些是C语言中常见的数组初始化方式。对于某些特殊情况,可以使用C标准库中的memset函数来初始化数组。memset函数用于将指定的内存区域设置为特定的值。使用大括号初始化器是一种简单且常用的数组初始化方式。通过在大括号中列出数组的元素,可以在声明数组时直接为其赋初值。另一种常见的数组初始化方式是使用循环语句为数组的每个元素赋值。

m0_47037246的博客 556

C语言二维数组初始化详解

本文介绍了C语言中常用的4种二维数组初始化方式,并依此列出了相应的代码、解释和输出结果。希望本文对于初学C语言或者对于二维数组初始化方式存在疑惑的读者有所帮助。

weixin_47712251的博客 1万+

数组的四种初始化方式

第一种: 对数组的每一个成员都进行初始化 demo1: int age[8] = {23,23,21,45,3,23,34,12}; age[0] = {23}; age[1] = {23}; age[2] = {21}; age[3] = {45}; age[4] = {3}; age[5] = {23}; age[6] = {34}; age[7] = {12}; 第二种: 初始化一部分,但其它元素默认为零 demo2: int weights[24] = {65,54,34,34};//数组成员0-

weixin_46060711的博客 9993

C语言常见问题——数组初始化的四种方法

有一回,小易同学对我说:“你学过编程吗”,我略略点一点头。他说,“学过编程,我便考一考你,在使用数组之前,应不应该初始化数组?”我暗想,这么简单的问题,也配考我么?不只是数组,在使用任何变量之前,都应该对变量进行初始化,这是一个编程的好习惯,可以有效避免许多由于垃圾值导致的bug。于是我回过脸去,不再理会。小易同学等了许久也不见我回答,很诚恳的说道,“不知道罢?我教给你,记着!......数组初始化有4种写法——” 初始化列表、memset函数、指定初始化器、for循环

易水卷长空的博客 15万+

数组初始化的4种方式

1. 直接给每个元素赋值 int array[4] = {1,2,3,4}; 2. 给一部分赋值,后面的全部为0 int array[4] = {1,2}; 3. 由赋值参数个数决定数组的个数 int array[] = {1,2}; 4. 数组元素的值是随机分配的 int array[4] = {}; 当初始化参数时,推荐使用 int array[4] = {0}; void Print(i...

giantmfc123 8万+

分享c语言初始化数组简单还实用的四种方法

初识c语言中,不满于每次屏幕打印都是固定值,因为这段代码只能解决那一个问题。我们肯定希望哪怕在release版本中能解决更多相似的问题,这就需要数组的长度在写完代码但运行前都是未定的,并且有些情况需要我们自己指定元素是什么,有些是需要电脑随机生成。

我的博客 7920

C语言数组初始化表示方法

C语言数组初始化表示方法 一、C语言一维数组初始化: (1)在定义数组时对数组元素赋以初值。如: static int a[10]={0,1,2,3,4,5,6,7,8,9}; 经过上面的定义和初始化后,a[0]=0,a[1]=1,… ,a[9]=9。 (2)初始化时可以只对一部分元素赋初值。例如: static int a[10]={0,1,2,3,4}; 定义的数组有10个元素,但只对其中前...

wu694128的博客 3万+

C语言中字符数组初始化的几种方法

1.C语言中的字符数组初始化 在C语言中,字符串是当做字符数组来处理的;所以字符串有两种声明方式,一种是字符数组,一种是字符指针。 1.1 直接逐个初始化字符数组:字符数组初始化,最容易理解的方式就是逐个字符赋给数组中各元素。 char strr[] = {'I',' ','a','m',' ','h','a','p','p','y'}; 1 注意:如果花括号中提供的字符个数大于数组长度,则按语法错误处理;若小于数组长度,则只将这些字符数组中前面那些元素,其余的元素自动定为空字符(即’\0’)。 ..

weixin_45511052的博客 2万+

C语言数组初始化

    这是很基础的东西,但基础的重要性不言而喻,我敢肯定这个知识点我肯定曾经了解过,但现在,我不敢确定,由此可见纪录的重要性,这世界没有什么捷径,找对方向,然后不停重复.所以从今天开始,我会比较详细的纪录这些比较小的知识点,其实还是有不少有意思的地方的.    写这篇文章的起因在于>第七章新东西太多,看的我目不暇接,所以在网上找了些例子看,其中就有一个例子中出现了这样的语句: ...

Lance的专栏 23万+

c语言初始化一个数组_用C初始化一个数组

c语言初始化一个数组In this article, we’ll take a look at how we will initialize an array in C. 在本文中,我们将研究如何在C中初始化数组。 There are different ways through which we can do this, so we’ll list them all one by one. ...

从零开始的教程世界 1万+

C语言数组初始化为一个数字的技巧

C语言中,当我们使用数组的时候,我们或许会希望数组一开始全部被赋予某个特殊的值,我们该怎么做呢? 1.全部赋值为0 int main() { int c[5]={0};//这种办法很简便,但好像只对赋值为 0 才有效,其它的数字都只会给下标为0的赋值 for(int i=0;i<5;i++) printf("%d ",c[i]); return 0; } //输出结果: 0 ...

逍遥云中鸟 2万+

c语言 字符串数组 初始化,C 字符串数组初始化问题

1、定义的时候直接用字符串赋值char a[10]="hello";注意:不能先定义再给它赋值,如char a[10]; a[10]="hello";这样是错误的!2、对数组中字符逐个赋值char a[10]={'h','e','l','l','o'};3、利用strcpychar a[10]; strcpy(a, "hello");易错情况:1、char a[10]; a[10]="hello"...

weixin_39790717的博客 8971

【C语言初始化数组,C语言初始化特定列表和元素!

如果没有显式地初始化数组变量,那么就会采用一般规则:如果数组具有动态存储周期,那么数组元素的值就是没有定义的。否则,所有的元素都会被默认地初始化为 0(如果数组元素是指针,则会被初始化为NULL)。 编写初始化列表 当在定义数组时,若要显式地初始化数组,必须使用初始化列表(initialization list):这是用逗号分隔开的初始化器(initializer)列表,也就是将每个数组元素的初始值放在大括号 {} 内。如下所示: int a[4] = { 1, 2, 4, 8 }; 上述.

HUYA69的博客 2887

C语言数组初始化及malloc初始化

前言 做笔试题的时候老有些小错误,来总结一下。 数组赋值初始化的三个方式 1、{0} 初始化 例如: int nums[3] = {0}; 但是经常出现的是给定长度(变量)然后需要进行初始化,如果写成下式: int main(){ int numsSize=0; scanf("%d",&numsSize); int nums[numsSize]={0}; } 则会出现以下报错信息: error: variable-sized object may not be initialize

qinghuanduji的博客 1万+

C语言数组初始化的三种方法

C语言中,数组初始化的方式主要有三种: 1、声明时,使用 {0} 初始化; 2、使用memset; 3、用for循环赋值。 那么,这三种方法的原理以及效率如何呢? 请看下面的测试代码: #define ARRAY_SIZE_MAX (1*1024*1024) void function1() { char array[ARRAY_SIZE_MAX] = {0}; ...

专注基础架构领域 1万+

C语言结构体数组初始化

该摘要解释了C语言结构体数组初始化的语法规则,重点说明了指定初始化器(designated initializer)的用法。根据C标准,初始化器可以是赋值表达式或用花括号括起的初始化列表,其中可包含指定符(.成员名)来明确初始化特定成员。未初始化的成员会被自动赋零值,初始化顺序可任意,后出现的初始化器会覆盖前面的值。摘要还列举了多个初始化示例,包括嵌套结构体、联合体、字符数组等复杂情况,展示了如何通过指定成员名来灵活初始化结构体数组的不同成员。

taylorle的博客 1071

C语言 - 数组与结构体初始化方法

C语言 - 数组与结构体初始化方法与区别 说明 本文的测试均在VS2015的开发环境下测试。 数组与结构体初始化方法 假设结构体为: struct Node { int a; int b; int c; }; 1.定义变量后,再初始化 int array[5]; array[0] = 0; array[1] = 1; array[2] = 2; arr...

m0_37622637的博客 4784
上一篇: 宽度优先遍历无向图
下一篇: strlen-C语言实现
dinosaur2004
博客等级 码龄3年 612粉丝 18原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值