typedef struct //定义结构体
{
int *elem;//基址
int length;//线性表长度
int listSize;//当前已经分配的储存容量
}SqList;
int SqListInit(SqList &list)//初始化
{
list.elem=(int *)malloc(3 * sizeof(int));
list.length=0;
list.listSize=LIST_INIT_SIZE;
return 1;//初始化成功返回一
}
void insertList(SqList &list)
{
int i;
int x;
for(list.length;;)
{
printf("请输入一个值: ");
scanf("%d",&list.elem[list.length]);
list.length++;
getchar();
printf("【继续按:1,退出按:2】: ");
scanf("%d",&x);
if(x==2)
break;
}
printf("输入成功!\n");
return;
}
void cx(SqList &list)
{
int i;
for(i=0;i<list.length;i++)
printf("%d\t",list.elem[i]);
printf("\n");
return;
}
int main()
{
SqList list;
SqListInit(list);
insertList(list);
cx(list);
return 0;
}
int main(){
int a = 1;
int * p = (int*)malloc(sizeof(int));
printf("越界读取: ");
printf("%d\r\n",*(p+1));
printf("越界操作\r\n");
*(p+1) = 2;
printf("%d\r\n",*(p+1));
return 0;
}
int main(){
int a = 1;
int * p = &a;
printf("越界读取: ");
printf("%d\r\n",*(p+1));
printf("越界操作\r\n");
*(p+1) = 2;
printf("%d\r\n",*(p+1));
return 0;
}
c++编译器不会检查越界问题
因为内存对齐的原因,包含3个整形的结构体,并不一定就是3个整形的长
刚查了一下这说明比较幸运,没有出现程序崩溃。
首先在堆栈申请的内存,后面也许还是没有别的程序在用,所以你的程序超过你申请的内存也不会出现问题;
但是如果有别的程序已经占用了你申请内存的后面空间,你再用就会出现无法写入,程序崩溃。所谓的分配了3个字节内存, 就是给你一个地址, 然后标记了后面3个内存是给你用的, 但你可以按这个地址继续向后(非法)访问, 除了p[0]之外, 对p[1], p[2], ...的读写访问都是非法的
C语言编译器不进行越界检查, 所以表面上你的程序还能跑, 但这样非法访问内存的程序很危险“能”只是系统不报异常而已,内存是平板式放置的,可写区域有很大,只要不超过heap size就不会报错,但是你肯定要破坏其他数据,真正报错的时候你早就不知道怎么办了
想“分配了3个超过就报错”等于让系统帮你检查内存访问越界,这个代价是非常高昂的,性能上根本不允许
加句号