| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1165 人关注过本帖
标题:数组访问越界问题求解
只看楼主 加入收藏
朔源
Rank: 1
等 级:新手上路
帖 子:105
专家分:4
注 册:2015-9-22
结帖率:90%
收藏
已结贴  问题点数:15 回复次数:2 
数组访问越界问题求解
程序编译正确,运行过程中出现错误:DAMAGE:after Normal block (#45) at 0x003707AB

#include<stdio.h>
#include<conio.h>
#include<malloc.h>

typedef struct
{
    int hang;//行标
    int lie;//列标
    int zhi;//值
}HLZ;

typedef struct
{
    HLZ * sz;
    int hs;//矩阵的行数
    int ls;//矩阵的列数
    int fls;//矩阵非零个数
}SHLF;

int main()
{
    HLZ * sl;
    int a=0,b=0,i,j;
    int ar[12][12]=
    {
        {0,0,2,0,0,0,0,0,0,7,0,0},
        {0,0,0,0,0,0,0,0,0,8,0,0},
        {0,0,0,0,0,0,0,0,0,8,0,0},
        {0,0,0,0,0,0,7,0,0,0,0,0},
        {0,0,0,0,0,0,0,0,0,9,0,0},
        {0,0,0,0,0,0,0,0,0,8,0,0},
        {0,0,0,0,0,0,5,0,0,0,0,0},
        {0,0,0,0,0,6,0,0,0,0,0,0},
        {0,0,0,4,0,0,0,0,0,0,0,0},
        {0,0,0,0,0,0,0,0,0,0,0,0},
        {0,1,0,0,0,0,0,0,0,8,0,0},
        {0,0,0,0,7,0,0,0,0,0,0,0},
    };
    for(i=0;i<12;i++)//找稀疏矩阵非零元素
    {
        for(j=0;j<12;j++)
        {
            if(ar[i][j]!=0)
                a++;
        }
    }
    printf("a=%d\n",a);
    sl=(HLZ *)calloc(a,sizeof(int));
    for(i=0;i<12;i++)
    {
        for(j=0;j<12;j++)
        {
            if(ar[i][j]!=0)
            {
                sl[b].hang=i;
                sl[b].lie=j;
                sl[b].zhi=ar[i][j];
                b++;
            }
        }
    }
    for(i=0;i<a;i++)
        printf("第%d行,第%d列,值是: %d \n",sl[i].hang,sl[i].lie,sl[i].zhi);   
// 到这里就错了,自己找过知道是数组访问越界,但不会改。求高人指点。
    free(sl);
    sl=NULL;
    getch();
    return 0;
}
搜索更多相关主题的帖子: 数组 越界 int 矩阵 for 
2017-09-15 23:41
xzlxzlxzl
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖北
等 级:贵宾
威 望:125
帖 子:1091
专家分:5825
注 册:2014-5-3
收藏
得分:15 
不知道题主是从哪方面知道数组越界的?其实很多时候数组越界访问并不触发错误,除非你的指针指向了系统保护区。
题主这个错误是由申请的内存少于实际需要,越界改写破坏了申请的内存块,导致释放内存错误造成的,题主代码“sl=(HLZ *)calloc(a,sizeof(int));”只申请了一个int的内存,而结构体变量需要3个int的内存,如果没有改写这块内存则不会出问题,但如果改写了超过实际申请的界限内存后,释放时系统会检测出内存块损坏而提示错误,如果修改为:“sl=(HLZ *)calloc(a,sizeof(int)*3);”或“sl=(HLZ *)calloc(a,sizeof(HLZ));”就不会有错误提示了。

[此贴子已经被作者于2017-9-16 05:26编辑过]

2017-09-16 05:15
朔源
Rank: 1
等 级:新手上路
帖 子:105
专家分:4
注 册:2015-9-22
收藏
得分:0 
回复 2楼 xzlxzlxzl
非常感谢!
2017-09-16 12:34
快速回复:数组访问越界问题求解
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.143710 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved