奇怪!数组下标可以为负值?!今天遇到了一个非常奇怪的现象!数组的下标可以负值!!搞不清怎么会是,烦请高手指
奇怪!数组下标可以为负值?!
今天遇到了一个非常奇怪的现象!数组的下标可以负值!!搞不清怎么会是,烦请高手指点迷津!
- C/C++ code
#include "stdafx.h"#include <iostream>#include <fstream>#include <climits>#include <memory>#include <new>#define maxRow 5000#define maxCol 5000using namespace std;static int myReadData(double inData[], int nrow ,int ncol ,char Filedir[] );int _tmain(int argc, _TCHAR* argv[]){ int nrow,ncol,nmax,ttotalmax,nmin,ttotalmin; char myFiledir[255]; int *maxindex = new int [maxRow*maxCol]; int *minindex = new int [maxRow*maxCol]; double *inData = new double [maxRow*maxCol]; cout << "请分别输入数据矩阵的行数和列数:" ; cin >> nrow; cin >> ncol; myReadData(inData,nrow,ncol,myFiledir); //读取数据 return 0; //在这里设置断点,当程序运行到这里时,在监视窗口输入inData[-1],居然没有报错,而且显示了一个随机值!}static int myReadData(double *data,int nrow,int ncol,char Filedir[]) //读取数据,存在一个二维数据中{ fstream openfile; int i,j; openfile.open("E:/data.txt",ios::in); if(!openfile) { cout<<"文件打开失败!"<<endl; return 0 ; } for(i=0;i<nrow*ncol;i++) openfile >> data[i]; openfile.close(); return 1;}大家讨论一下啊,这是怎么回事?还有一个现象就是定义静态数组和动态数组,下标负值的范围不一样。当采用“double *inData = new double [maxRow*maxCol];”方式时,下标最小可以取到-8,而采用“double inData[maxRow*maxCol];”则可以取到更小的下标。请问是什么原因?谢谢!
[解决办法]
g[i] = *(g + i)
[解决办法]
你能读,不能表示你就能对那块内存为所欲为.
数组的访问就是
address[N] = N[address] = *(address + N);
N为负数就是越界.
[解决办法]
数组的subscriptor操作, 归根到底,只是指针偏移的操作,
int a[5];
a[-1]其实也就是*(a - 1), 没什么了不起的.
[解决办法]
我感觉实际上数组下标也是个整形数值,你打上负值会按照补码取正,让我去验证一下给你答复
[解决办法]
不奇怪,编译器本来就不对数组的下标进行检查,这些检查都是靠程序员。
你可以试试定义一个10长度的数组,然后读取第11,12.。。个元素,编译器依旧不会报错,
[解决办法]
[解决办法]
c/c++不检查数组越界,inData[-1]取到了数组前一个位置的值,这个值数据是不确定的
[解决办法]
3楼说的没错
- C/C++ code
#include <stdio.h>#include <stdlib.h>void main(){ int a[8] = {0,1,2,3,4,5,6,7}; int *p = a + 2; //p指向a[2]的地址 printf("%d",p[-1]);//输出是1 system("pause");}
[解决办法]
监视窗口允许的,编译器不允许就可以了^_^。inData[-1]只是返回了inData前面系统隐藏的cookies,并以double解析而已。
不同的分配方式,系统有着不同的cookies
------解决方案--------------------
