首页 > 试题广场 >

下面这个程序执行后会有什么错误或者效果。

[不定项选择题]
下面这个程序执行后会有什么错误或者效果:
#define MAX 255
int main(){
     unsigned char A[MAX], i;
     for (i = 0; i <= MAX; i++)
         A[i] = i;
}
  • 数组越界
  • 死循环
  • 栈溢出
  • 内存泄露
推荐
死循环加数组越界访问(C/C++不进行数组越界检查)
MAX=255
数组A的下标范围为:0..MAX-1,这是其一..
其二.当i循环到255时,循环内执行:
  A[255]=255;
这句本身没有问题..但是返回for (i=0;i<=MAX;i++)语句时,
由于unsigned char的取值范围在(0..255),i++以后i又为0了..无限循环下去.

编辑于 2015-02-03 16:10:46 回复(17)
#include   <stdio.h>
#define MAX 255 
int main() {
unsigned char a[MAX],i; 
for(i=0;i<=MAX;i++)
a[i]=i;
for(i=0;i<=MAX;i++) 
printf("%d ",a[i]); 

看看有什么错误? 这个问题错误很隐蔽。。。
这个问题能将面试者的能力分为三类;
一:没错。。。那么说明面试者的C语言基础能力不行;
二:有个错,是哪个i<=MAX; 数组下标越界。。嗯,还行;
三:死循环,C的基本功很强。。达到了该题的测试目的;

分析了一下: 
出现了两个问题; 
一:下标越界可以说是个问题,但不是问题的本质; 当i=MAX;即i=MAX是,对数组来说,255是越界了,那如果我把数组下标改了是不是就对了呢?比如说如下:
#include <stdio.h>
#define MAX 255
int main() { 
unsigned char a[256],i;//这里改成256是不是就对了呢? 还是不对;
for(i=0;i< =MAX;i++)
a[i]=i;
for(i=0;i< =MAX;i++) 
printf("%d ",a[i]); 
 
其实越界了编译还是能通过的,因为编译器不检查越界问题;

问题二: 上例还是错的,原因在于unsigned char 这个数据类型,它占了 8位,表示范围是 0~255(00000000~11111111,八位); 当改成256后,虽说看似数组下标没越界,但是当i=255; i++ ;因为 i本身是unsigned char类型,占8位,所以此时i+1变成了100000000 9位,又因为i只能占8位,所以舍掉了最高位,此时的i值又变成00000000了,即就是0;然后就成了死循环了。。。
发表于 2015-10-26 14:19:40 回复(8)
数组下标越界:这个应该是的问题,数组255大小,但是当a[255]就是256个元素,相当于越界了。
死循环:这个就是字符型的变量大小在0-255之间,所以说i永远不可能大于255的,死循环。
内存泄漏:创建的临时变量,在栈中,应该会由系统自动释放,所以应该是不存在内存泄漏的问题。
内存溢出:通俗理解就是内存不够,通常在运行大型软件或游戏时,软件或游戏所需要的内存远远超出了你主机内安装的内存所承受大小,就叫内存溢出。此时软件或游戏就运行不了,系统会提示内存溢出,有时候会自动关闭软件,重启电脑或者软件后释放掉一部分内存又可以正常运行该软件。
栈溢出:属于缓冲区溢出的一种。栈溢出是由于C语言系列没有内置检查机制来确保复制到缓冲区的数据不得大于缓冲区的大小,因此当这个数据足够大的时候,将会溢出缓冲区的范围。
发表于 2016-11-03 11:45:04 回复(2)
AB,i是无符号8位,范围0~255,当i++到255后,再自加1的时候i变为0,周而复始,进入死循环;数组下标范围是0~254,A[255]时,数组越界;
编辑于 2015-09-24 12:09:38 回复(0)
(C/C++不进行数组越界检查)
发表于 2015-08-26 16:07:01 回复(0)
栈溢出的例子
#include <stdio.h>

void overflow(char* s) {
    char buffer[10];
    strcpy(buffer, s);
}

int main() {
    char* s = "1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890";
    overflow(s);
    printf("Program terminated normally.\n");
    return 0;
}
通常,当程序调用函数时,会将函数的参数、返回地址和局部变量等信息存储在栈空间中。如果这些数据的总大小超过了栈的容量,就会导致栈溢出。在这个示例中,函数overflow定义了一个大小为10的缓冲区buffer,并尝试将输入的字符串s拷贝到缓冲区中。然而,当输入的字符串超过10个字符时,就会发生栈溢出。

编辑于 2023-03-10 15:42:13 回复(0)
A 数组越界 Max值为255,则数组下标最大为254,i<255
发表于 2015-05-12 09:03:45 回复(0)
由于unsigned char的取值范围在(0..255),i++以后i又为0了..无限循环下去.
发表于 2020-03-25 21:43:09 回复(0)
unsigned char占   8位,范围是   0~255(00000000~11111111,八位); 当改成256后,虽说看似数组下标没越界,当i=255; i++ ;变成100000000 9位,所以舍掉了最高位,此时的i值又变成00000000了,即就是0,成了死循环
发表于 2016-09-21 09:54:20 回复(0)
要注意unsigned char类型的范围是0-255,所以当循环执行到255时,再加1将变成0,从而再次循环。
C++不进行数组越界检查
发表于 2016-05-20 12:52:03 回复(0)
数组越界
发表于 2015-07-15 18:55:43 回复(0)
为啥不算栈溢出,数组越界不是算栈溢出吗,有没有大佬解释一下
发表于 2023-10-03 21:17:03 回复(0)
仔细看循环条件。。。。。。。。x<=MAX ...
发表于 2022-08-30 08:17:23 回复(0)
AB,i是无符号8位,范围0~255,当i++到255后,再自加1的时候i变为0,周而复始,进入死循环;数组下标范围是0~254,A[255]时,数组越界;
发表于 2021-12-13 20:01:35 回复(0)
i的类型是无符号整型  永远不会越界
发表于 2021-09-29 09:16:10 回复(0)
unsigned char A[MAX], i;注意i的类型是unsigned char 不是int

发表于 2020-09-10 23:58:31 回复(0)
堆栈溢出就是不顾堆栈中数据块大小,向该数据块写入了过多的数据,导致数据越界,结果覆盖了老的堆栈数据。
因为A[255]是已经越界了,所以赋值会覆盖之前的栈数据,那么根据上面这句话我觉得C是对的
发表于 2020-08-13 13:57:48 回复(0)
问题一:数组下标越界。 问题二: unsigned char 这个数据类型,它占了 8位,表示范围是 0~255(00000000~11111111,八位); 当改成256后,虽说看似数组下标没越界,但是当i=255; i++ ;因为 i本身是unsigned char类型,占8位,所以此时i+1变成了100000000 9位,又因为i只能占8位,所以舍掉了最高位,此时的i值又变成00000000了,即就是0;然后就成了死循环了。
发表于 2020-05-02 21:59:07 回复(0)
A,正确,C/C++编译器不检查数组溢出,也就是说能通过编译;
B,正确,i 为 char 型,占 1 字节,所以会死循环;
C,D 均错误。

内存溢出(out of memory):程序要求系统分配内存时,系统不能满足。
内存泄漏(memory leak):程序获得系统分配的内存后,无法释放已申请的内存空间。例如,new 后没有 delete。
memory leak 最终会导致 out of memory。
栈溢出属于缓冲区溢出的一种。
(参考:https://blog.csdn.net/ShanYu1198124123/article/details/52414392
编辑于 2020-01-22 12:49:28 回复(0)

1、数组越界。

2、死循环。unsigned char8位,超过255变256时,变为1,0000,0000,取后8位即为0,无限循环。

发表于 2018-10-10 01:07:42 回复(0)
i=256时不就发生值溢出了么?这个为什么不算栈溢出?
发表于 2018-06-06 11:08:01 回复(0)