首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

奇怪!数组上标可以为负值?

2012-10-15 
奇怪!数组下标可以为负值?!今天遇到了一个非常奇怪的现象!数组的下标可以负值!!搞不清怎么会是,烦请高手指

奇怪!数组下标可以为负值?!
今天遇到了一个非常奇怪的现象!数组的下标可以负值!!搞不清怎么会是,烦请高手指点迷津!

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.。。个元素,编译器依旧不会报错,


引用楼主 xiaolinxianju 的帖子:
今天遇到了一个非常奇怪的现象!数组的下标可以负值!!搞不清怎么会是,烦请高手指点迷津!


C/C++ code
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <climits>
#include <memory>
#include <new>

#define maxRow 5000
#define maxCol 5000
using namespace std;

static int myReadData(double inData[], int nrow ,int ncol ,char Filedir[] );

int _tmain(int argc, _TCHAR*…

[解决办法]
探讨
你能读,不能表示你就能对那块内存为所欲为.

数组的访问就是
address[N] = N[address] = *(address + N);

N为负数就是越界.

[解决办法]
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
------解决方案--------------------


探讨
为什么数组采用不同的定义方式,负值所取的范围是不同的呢?有什么方法可以将它们的范围统一吗?

热点排行
Bad Request.