• 全部
  • 问答

程序有个很难理解的bug,求助!请教各位大神,注释的那句//printf("%d",array[i]);为什么一定要加,不加程序就会停止运行,不应该啊。加

吉大秦少游 615所 工程师  2018-06-24 08:31:38
#include <stdio.h>
#include <stdlib.h>

int Xmin(int a[],int n);
int Xmax(int a[],int n);
int Ymin(int a[],int n);
int Ymax(int a[],int n);

main(){
int num; //存储顶点数量
scanf("%d",&num);
int *array; //用一位数组存储顶点坐标
array=(int*)malloc(num*sizeof(int));
int i,j; //循环存储结点
for(i=0;i<2*num;i++)
{
scanf("%d",&array[i]);
// printf("%d",array[i]);
}
printf("%d %d %d %d\n",Xmin(array,num*2),Ymin(array,num*2),Xmax(array,num*2),Ymax(array,num*2));
return 0;
}

int Xmin(int a[],int n){
int i;
int ret=-1; //输出接口
int tem=a[0];
for(i=2;i<n;i=i+2){
if(tem<a[i]);
else {
tem=a[i];
}
}
ret=tem;
return ret;
}

int Xmax(int a[],int n){
int i;
int ret=-1; //输出接口
int tem=a[0];
for(i=2;i<n;i=i+2){
if(tem>a[i]);
else {
tem=a[i];
}
}
ret=tem;
return ret;
}

int Ymin(int a[],int n){
int i;
...全文
208 点赞 收藏 6
写回复
6 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
JackyRao 2018-07-07
明显的内存溢出
回复
www_adintr_com 2018-06-25
C++ 本身并没有对内存做什么保护, 你访问越界了, 直接就覆盖掉后面部分的内存, 如果后面部分的内存刚好没有其他人使用, 没有覆盖到关键数据, 就会出现看起来正常的现象.
回复
吉大秦少游 2018-06-24
嗯嗯,发完就注意到了,array=(int*)malloc(2*num*sizeof(int));,申请内存空间不够。
但是我在测试的时候发现即使申请的内存不够,有时也是可以用的,例如,申请3个int空间,可以存6个;但是申请5 个,不能存10个。虽然应该用多少,申请多少,但是看来申请的时候,内存机制也不一定会完全按照你申请的来,是这样吗?
回复
www_adintr_com 2018-06-24
申请的内存是 num 个: malloc(num*sizeof(int));
访问却是 2 * num 个: for(i=0;i<2*num;i++)
这不是赤裸裸的越界吗!
回复
wang0635 2018-06-24
引用 2 楼 zhanshen112 的回复:
嗯嗯,发完就注意到了,array=(int*)malloc(2*num*sizeof(int));,申请内存空间不够。
但是我在测试的时候发现即使申请的内存不够,有时也是可以用的,例如,申请3个int空间,可以存6个;但是申请5 个,不能存10个。虽然应该用多少,申请多少,但是看来申请的时候,内存机制也不一定会完全按照你申请的来,是这样吗?

只是你没有遇到更难受的结果。不能正常运行,这不就是问题吗?至于加了之后可以了,也只能说错误的效果相互抵消了而已
回复
赵4老师 2018-06-24
其实电脑开机后物理内存的每个字节中都有值且都是可读写的,从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页,一页通常为4KB。
回复
相关推荐
发帖
C语言
创建于2007-09-28

6.3w+

社区成员

C语言相关问题讨论
申请成为版主
帖子事件
创建了帖子
2018-06-24 08:31
社区公告
暂无公告