一个关于数组溢出的问题,请大神帮小弟解惑

问题描述

一个关于数组溢出的问题,请大神帮小弟解惑

vc6.0环境,代码很简单,但是不管你输入的数组n是多大,a[n]的值都是n,按理说不是最大就到n-1了吗,为什么不报错?
#include
using namespace std;
int main()
{int i;int a[11];
int*p=a;
for(i=0;i<=10;i++)
a[i]=i;
cout<<a[11];

return 0;
}

解决方案

你试试int *a = new int[11];数组实际上放在栈内,new出来的空间是放在堆里面,具体的你需要再找找相关资料看看。

解决方案二:

数组是越界了,但越界并不表示一定要报错。
这样的错误,可能会影响程序的功能,但不是报错的条件。也许这样越界后,导致(可能)后面的指针错误,误操作系统区或其它不应该操作的区域,这时才会报错的。

解决方案三:

编译器对越界不会报错,但在运行时,如果数组越界,就会使其访问了非法内存,如果跟其它线程冲突,可能会使程序混乱,从而使程序崩溃。
你这里的a[11]肯定是数组越界的,而你读取的a[11] 的值恰好等于11是巧合,如果你再次运行,其值可能就不是11了,而是一个随机的值。

希望能帮到您。

解决方案四:

你好,数组越界是不会报错的,C++的就是如此,尽量少做以提高效率,把需要做的交给程序员自己,以达到高效的控制。
至于那个值的巧合,对于a[i]而言,就是相对与首地址a偏移i个单位的内存,你已对那个越界的地址进行了写操作,再读出来并没什么奇怪的,谁让这个程序比较“幸运“,没有崩溃

解决方案五:

抱歉,上次没看清代码,这段代码在Vs上测试与你的情况不同,因为VS上对于栈上分配内存,地址并不是递减的
你使用的编译器可能是严格递减的,也就是说 ”i“ 的地址比”a“大 4 * 10 (数组的大小),所以 a[n] 刚好引用的是 ”i“的内存,所以就会有这个巧合

解决方案六:

编译器的原因,或者说是语言的原因。vc6.0和vs对于c语言、c++不会检测数组越界这个异常。因此编译是可以通过。但是在程序运行时,在内存中并没有a[11]这块内存。这就会导致你查找的数值是一个你并没有赋值的一个“垃圾值”,这个数值是你不受你控制的,因为你根本没就有产生一个变量和数值“指向”。导致了c用起来也非常“危险”。java/c#的编译器会自动检测数组越界异常。

解决方案七:

new 11个,索引是0-10,你用11座索引,当然越界了。

解决方案八:

另外,这里使用时用的是数组首地址加上索引乘以单个类型的长度作为地址,然后从这里开始读取制定类型数据,
所以也能读取,数字、字符等应该没有问题,但如果用的是自定义的类型,就可能要报错了。

解决方案九:

#include
using namespace std;
int main()
{int i;int a[11];
int*p=a;
for(i=0;i<=10;i++)
a[i]=i;
cout<<a[11];

return 0;
}

c++不进行下标检查

解决方案十:

你用liunx系统会报警告

时间: 2024-10-04 11:46:26

一个关于数组溢出的问题,请大神帮小弟解惑的相关文章

java 数组 效率-请大神帮我纠错!Java数组的问题

问题描述 请大神帮我纠错!Java数组的问题 给一个int 数组A[],和一个X,已知A中各元素是升序排列,要求返回X在A中的位置.A可能狂大,注意性能.class Solution { int solution(int[] A int X) {if (A == null) return -1; int N = A.length; if (N == 0) { return -1; } int l = 0; int r = N - 1; while (l < r) { int m = (l + r

有一个关于Java的小题目,做了好久做不出来,还请大神帮我!

问题描述 有一个关于Java的小题目,做了好久做不出来,还请大神帮我! 请大家帮帮我,明天就要交作业了!5555555 解决方案 哪里做不出来,,,说下 解决方案二: 这是小题目么我想问....85分 解决方案三: 这都是一个功能了好不?关键你这也没说你哪儿不会啊 解决方案四: 页面不会写还是后台不会?你总得说清楚啊 解决方案五: 如果你搭好了框架,还是来张项目目录结构图来看看先

java-有一个关于Java的小题目,做了好久做不出来,还请大神帮我

问题描述 有一个关于Java的小题目,做了好久做不出来,还请大神帮我 package com.ustcsoft.javatraining2016.homework1.zhaoyao;public class homework1 { public static void main(String[] args) { Student student = new Student(); Student student2 = new Student(); Student student3 = new Stu

工具-如何实现这样一个数据列表,请大神帮帮忙

问题描述 如何实现这样一个数据列表,请大神帮帮忙 各位大神,小弟最近需要弄个数据列表,具体需求是从数据库中查询数据生成表格,这个数据时一行一行的.表格生成之后需要按照某一列的单元格内容进行分组,分组之后的数据可以折叠展开以方便查看(类似excel中行组合). 取数我还勉强能弄,但是前端分组+折叠/展开的功能实在是不会弄(原谅我是个小白,弄不出来就要失业了).请问有什么好的思路或者是现成的工具可以实现这个需求? 解决方案 什么语言什么平台没有说,假设你要的是web的http://download.

静态网页-新人问一个html的基础问题,请大神解答

问题描述 新人问一个html的基础问题,请大神解答 想用html和css写一个类似hao123的静态版,锻炼自己.只求大致相似即可.也学了基本的知识,可是开始写确无从下手,感觉在慕课上看的全都乱了,不知道什么显示要用什么元素写!怎么办? 解决方案 善于使用IE F12或者Chrome的开发者工具.它们非常适合你模仿某个现成网站的html/css,而且它们支持直接编辑css/html,并且立刻看到效果. 解决方案二: 学习应该先从基础学-一个标签一个标签的学,基础掌握好后再临摹,会事半功倍 解决方

递归算法-用栈存储指向一个二叉树结点的指针,中序遍历时,进行调试时总卡在GetTop()函数,请大神帮我看看

问题描述 用栈存储指向一个二叉树结点的指针,中序遍历时,进行调试时总卡在GetTop()函数,请大神帮我看看 利用栈存储指向一个二叉树结点的指针,可不知为什么,在进行中序遍历时,进行调试时总卡在GetTop()函数这里,请大神帮我看看 #include "stdio.h" #include "malloc.h" #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE

vc++-C语言结构数组的题,请大神看看错误出在哪里

问题描述 C语言结构数组的题,请大神看看错误出在哪里 #include struct sell { char dm[4]; char mc[10]; int dj; int sl; long int je; }sell[100]; void main() { int i,j,t; long int m; for(i=0;i scanf("%s,%s,%4d,%5d,%5dn",&sell[i]dm,&sell[i].mc,&sell[i].dj,&sel

数据转化-java的数据转换问题,请大神帮我看一下

问题描述 java的数据转换问题,请大神帮我看一下 今天看到书上讲到数据转化,我看不懂,拍给大家,请大家帮我解释一下,谢谢 解决方案 在用system.out.println时会自动转换,你也可以用(float)进行强制转换 解决方案二: java中,两个数运算时,如果类型不同,自动会转成类型相同,如果是int和float计算,则两个数都会转成float后再计算.第一张图a/b会有小数 第二张图 a,b都是整型,除法后a/b取整再转float.所以小数都是0,是因为是a/b除后舍去了小数. 解决

数据-我觉得我见鬼了,请大神帮我看看我到底是不是真的见鬼了,现在凌晨三点了

问题描述 我觉得我见鬼了,请大神帮我看看我到底是不是真的见鬼了,现在凌晨三点了 #include #include #include typedef struct Node ND; struct Node{ //结构体 int data; //数据预,存放结构体的数据,哲理简单化,假设只有一个data struct Node * pNext; //指针域,用来存放下一个节点的指针或者上一个节点的指针或者其他节点的指针,这里简化只存放下一个节点的指针 }; /*函数声明*/ //void trav