我在进行数组越界输出时编译器发生了什么呢?

来源:百度知道 编辑:UC知道 时间:2024/05/12 18:25:36
#include<iostream.h>
void main()
{
int *p;
int a[3]={1,2,3};
p=a;
cout<<sizeof(p)<<" "<<sizeof(p[0])<<" "<<*(p+4)<<" "<<a[4]<<endl;
}
上面代码输出的是 0 0 1245112 1245112

在VC上原来程序应改为:
#include<iostream>
using namespace std;
int main()
{
int *p;
int a[3]={1,2,3};
p=a;
cout<<sizeof(p)<<" "<<sizeof(p[0])<<" "<<*(p+4)<<" "<<a[4]<<endl;
return 0;
}
数组a的大小是3,所以合法下标是0~2。当下标越界时(如*(p+4)),p+4对应的操作是编译器从p开始往后走4个int型大小(假设为4个字节)个字节(共4×4=16个字节),再在(p对应地址+16)这个位置开始取出4个字节的数来,解释成一个int型数,用于cout的输出。在本例中,由于下标越界,所以取出来的数对用户来讲呈现出随机性。LZ对C语言的数组和指针操作还需要加深理解。

PS,现在C++还在用.h头文件,也忒怪异了。

编译器 检查是否有语法错误。a[4] 下标超界 编译通不过。(功能差的编译器可能查不出)

*(p+4) -- 没有语法错误,编译器查不出错误。

输出的数值,是从计算出的超界数组元素的单元地址里,取出的残余信号,转换出来的数值。