C++的数组声明的下标和上标界限

menuvb 2011-01-18 10:29:55
m=(float **) calloc((unsigned) (nrh-nrl+1),sizeof(float*));
for(i=nrl;i<=nrh;i++) {
m[i]=(float *) calloc((unsigned) (nch-ncl+1),sizeof(float));
if (!m[i]) nrerror("allocation failure 2 in matrix()");
m[i] -= ncl;
}
下列是变量值:
nrh:10
nr1:1

疑问来了,如果我认为c++的数组下标是从0开始,m[i]的赋值最终为什么不会超出限制。
...全文
419 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
sghdls 2011-01-18
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 pengzhixi 的回复:]

当然可以是负数
比如:
int a[10];
int *p=&a[5];
p[-1]=20;
[/Quote]

这是运算, 不是数组定义啊. 我刚才没说清楚..
pengzhixi 2011-01-18
  • 打赏
  • 举报
回复
当然可以是负数
比如:
int a[10];
int *p=&a[5];
p[-1]=20;
sghdls 2011-01-18
  • 打赏
  • 举报
回复


数组下标值都是 大于或等于1的常量表达式啊

还能是负数吗?
bottlerun 2011-01-18
  • 打赏
  • 举报
回复
越界了一般可能不会立马出错,但接下来什么都可能发生
比如一个10元素的数组后面有个指针内容,你用a[10]这种越界操作
指针的内容就被莫名其妙改乱了
pengzhixi 2011-01-18
  • 打赏
  • 举报
回复
int a[4]={0};
int b[5]={0};

b[10]=10;
for(int i=0;i!=4;++i)
cout<<a[i]<<endl;


你可以试试这段代码吧
menuvb 2011-01-18
  • 打赏
  • 举报
回复
我想我了解了,可能是calloc函数的原因,它分配的内存大小是:(num * size)
cm2004 2011-01-18
  • 打赏
  • 举报
回复
你没遇到问题只能说是你运气好,你越界后占用的内存暂时没别的程序要调用
menuvb 2011-01-18
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 pengzhixi 的回复:]

看人品了。
[/Quote]

for (i = 1; i <= phmm->N; i++) {
for (j = 1; j <= phmm->N; j++) {
fscanf(fp, "%lf", &(phmm->A[i][j]));
}
fscanf(fp,"\n");
}
上面中:phmm->N是我前面的nrh值,phmm->A就是前面分配的数组的值。大家都说越界,但上面代码一切分配读取正常。
menuvb 2011-01-18
  • 打赏
  • 举报
回复
各位,上面的代码是我在一个C++程序里看到的,但事实是,这个程序并没有报任何异常,而且一切运行正常,数组读取也正常。我现在的问题是,C++程序越界了会怎么样
bluesky12312388 2011-01-18
  • 打赏
  • 举报
回复
程序越界了
pengzhixi 2011-01-18
  • 打赏
  • 举报
回复
数组不提供越界检查。
menuvb 2011-01-18
  • 打赏
  • 举报
回复
nch:10
ncl:1
忘记这二个变量值。

c++里,m[10]=10,如果越界,会怎么样?数组自动再增加一个元素,如果这是在C#,程序已经报异常了。
  • 打赏
  • 举报
回复
下标还能是负数。。。
没有上下界限,顶多越界。
bacmoz 2011-01-18
  • 打赏
  • 举报
回复
C++的数组不是数据类型,本质上更接近于或可以算作常指针

64,682

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧