对C语言-858993460出现的分析

背景

在我读大学期间,大一下学期才接触到了c语言这门课程,在学习过程中(其实我上课并没听老师讲的哈)主要讲的是太古老了,当时写的语句还是以void main开头的类似于

其次我比较贪玩,所以以后的c语言就是在猴博士和鹏哥那学起来的。

1.问题由来

熟悉的-858993460这串数字是从数组来的,当时是一场考试,用while循环来输出数组中的各个值,当时死活想不明白为啥有这串数字,真令人百思不得其解,我一直以为这应该是c++6.0的一个bug,当时上课还是c++6.0这个软件编写的,但现在都用vs。

2.什么导致了数字的出现

好的,长话短说直接来到核心部分,其根本原因就是你的初始化变量超出了数组范围,要知道,数组的输出是下标来决定的。

比如我定义一个整形i=0,利用while循环就可以把arr[]数组每一个值都输出去。那么i里面的循环条件就是一个至关重要的问题。

有不少同学就跟我下图一样,看到arr[]数组里面有7个数字,丝毫不思考直接来个while(i<8)

(我就是哈哈哈)。

结合上面所说的,数组的每一个元素都对应着下标。比如arr[0]=1,arr[1]=2;

但是这里填i<8真的对吗,答案是错的,虽然说i<8也可以输出,但是莫名其妙的出现了-858993460这串熟悉的数字,这就是定义的初始化变量i超出了范围所致。

#include <stdio.h>
int  main()
{
	int i = 0;
	int arr[7] = { 1,2,3,4,5,6,7 };
	         //下标 0,1,2,3,4,5,6  
	while (i < 8)//此处应该写成i<7才对
	{
		printf("%d\n", arr[i]);
		i++;
	}
	return 0;
}

3.-858993460数字的含义

我们其实可以想一下,为啥非得是-858993460这串数字呢,不能是-123456789吗?

其实它是有含义的,我们在遇到问题的同时不妨了解一下

1.二进制与十六进制

.-858993460在二进制中表示为11001100110011001100110011001100。

转换成十六进制则为0xCCCCCCCC。

2.在C++编程中的含义

  1. 在C++中,-858993460经常作为未初始化内存或栈空间的标志值出现。当程序分配栈空间时,为了调试和安全的需要,可能会将这段空间的初始值设置为0xCCCCCCCC(即-858993460)。-858993460作为0xCCCCCCCC的十进制表示,在调试过程中可能作为一个信号值出现,提示开发者程序已经到达了一个预设的断点。
  • 在C++程序中,如果访问了未初始化的变量或越界的数组元素,可能会输出-858993460这样的值。这是因为这些内存区域可能已经被填充为0xCCCCCCCC,当被当作整数打印出来时,就表现为-858993460。
  • 在某些情况下,如果程序中的指针运算或数组访问出现错误,也可能导致输出-858993460。这通常是因为指针指向了错误的内存地址,而这个地址恰好包含了0xCCCCCCCC这样的值。

综上所述,-858993460在C++编程中通常表示未初始化内存的值或作为调试断点信号出现。在程序输出中看到这个值时,应该仔细检查相关的变量和内存访问操作,以确保程序没有访问到未初始化的内存或越界的数组元素。同时,也可以利用这个特征值来进行调试和错误排查。

4.代码分析解决问题

那么我们从最上面看,首先i=0进入循环,第一次输出arr[0],第二次输出arr[1],第三次输出arr[2],那么以此类推,把数据输完应该是 第7次输出arr[6],此时我们的i就是6,再经过一个i++,i变成7,如果我们while循环的条件是i<8,那么i=7就要进入循环当中去,但是我们并没有arr[7]这个元素,所以程序访问到了越界的数组元素,自然就报错-858993460啦。

然而当我们改正之后一切就都万事大吉啦

#include <stdio.h>
int  main()
{
	int i = 0;
	int arr[7] = { 1,2,3,4,5,6,7 };
	   
	while (i < 7)
	{
		printf("%d\n", arr[i]);
		i++;
	}
	return 0;
}

当然啦我们用for语句依然是可以滴

#include <stdio.h>
int  main()
{
	int i = 0;
	int arr[7] = { 1,2,3,4,5,6,7 };
	for(i=0;i<7;i++)
	{
		printf("%d\n", arr[i]);
	}
	return 0;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值