C语言数组初始化的垃圾值问题——以一维数组打印杨辉三角为例

问题场景:

利用一维数组打印杨辉三角


代码逻辑

杨辉三角的性质:
	杨辉三角中的每个元素等于其左上方和正上方两个元素之和。对于第一列(j=0)和最后一列(j=i),其值恒为 1。
代码实现的关键点:
    使用一个一维数组 tmp 来存储当前行的数据。
    每次计算新一行时,通过变量 l 和 r 分别保存左上和正上的值。
    由于 tmp 数组的初始值被正确初始化为 0(除了第一个元素为 1),确保了计算过程不会受到垃圾值的影响。

问题描述

初试代码如下:

//利用一维数组打印杨辉三角
#include
#define MAXSIZE 10	//MAXSIZE为杨辉三角的行数

int main(){
	int l,r,i,j;//l,r分别存放旧的tmp[j-1]和tmp[j],分别为当前元素的左上和正上元素(只是模拟)
	int tmp[MAXSIZE];
	tmp[0] = 1;
	for(i=0; i<MAXSIZE; i++){
		l = 0;
		for(j = 0; j <= i; j++){
			r = tmp[j];
			tmp[j] = l + r;
			printf("%-4d", tmp[j]);
			l = r;	//	给同行下一个(右边)元素做准备,
		}
		printf("\n");	
	}
	return 0;
}

考虑利用left和right保存当前元素位置及前一位置的旧值模拟当前元素的父母元素。
第一次初始化时尝试以下代码:

int tmp[MAXSIZE];
tmp[0] = 1;	

执行结果为:
C语言数组初始化的垃圾值问题——以一维数组打印杨辉三角为例_第1张图片


原因分析:

在这段代码中,tmp[MAXSIZE] 定义了一个大小为 MAXSIZE 的整型数组,但没有对数组的所有元素进行显式初始化。根据 C 语言的标准,局部变量(如这里的 tmp)如果没有显式初始化,则其内容是未定义的(即包含垃圾值)。因此,除了 tmp[0] 被明确赋值为 1 外,其余的 tmp[1] 到 tmp[MAXSIZE-1] 中的值可能是随机的垃圾值。

当程序运行到以下代码时:

r = tmp[j];
tmp[j] = l + r;

如果 j > 0,那么 tmp[j] 的值可能是一个随机的垃圾值,导致计算结果错误。

解决方案:

上述初始化代码改为如下:

int tmp[MAXSIZE] = {1};

在这里,使用 {1} 对数组进行了部分初始化。根据 C 语言的规则,如果只对数组的一部分进行初始化,未初始化的部分会被自动设置为 0。因此,tmp[0] 被初始化为 1,而 tmp[1] 到 tmp[MAXSIZE-1] 都被初始化为 0。

这样一来,当程序运行时,tmp[j] 的值始终是有意义的(要么是之前计算的结果,要么是初始的 0),从而避免了垃圾值的影响,保证了杨辉三角的正确计算。

总结

原始代码中,tmp[MAXSIZE] 没有被完全初始化,导致数组中可能存在垃圾值,从而影响计算结果。将 tmp[MAXSIZE] 修改为 int tmp[MAXSIZE] = {1}; 后,数组的其余部分被初始化为 0,消除了垃圾值的影响,从而使程序能够正确输出杨辉三角。

你可能感兴趣的:(算法相关,c语言,算法,数据结构)