C语言——经典面试题

哈喽,大家好,今天我们来学习一道面试过程中可能会出现的一道笔试题

有这样一段代码,分析在VS编译器的运行结果

 

#include
int main()
{
	int i = 0;
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	for (i = 0; i <= 12; i++)
	{
		arr[i] = 0;
		printf("hehe\n");
	}
	return 0;
}

不少伙伴都认为执行这段代码会打印13次“hehe”然后程序就崩溃(数组越界访问)了,带实际运行结果是什么呢?

C语言——经典面试题_第1张图片

我们发现程序并没有出现崩溃的现象,而是在持续不断的打印出“hehe”,这是为什么呢?

让我们来调试一把代码吧:

我们在调试时监视每个值的变化:

C语言——经典面试题_第2张图片

C语言——经典面试题_第3张图片

C语言——经典面试题_第4张图片

 

C语言——经典面试题_第5张图片

 经过我们不断地按f11键,我们发现arr[12]的值总是和i的值一起变化,我们猜测i和arr[12]是占用同一块内存空间的。

C语言——经典面试题_第6张图片

 通过调试,我们也确实发现arr[12]和i的地址是一样的:

C语言——经典面试题_第7张图片

当我们先定义arr数组,再定义i程序的运行结果就不一样了:

#include
int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int i = 0;
	for (i = 0; i <= 12; i++)
	{
		arr[i] = 0;
		printf("hehe\n");
	}
	return 0;
}

此时程序崩溃了: 

C语言——经典面试题_第8张图片

 

 而像这样的一道题曾在某家公司的笔试题出现过:

C语言——经典面试题_第9张图片

 只要我们按照上边图片上的方式回答,这10分的题就能轻松到手了

你可能感兴趣的:(C语言,c语言)