免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1750 | 回复: 5
打印 上一主题 下一主题

当程序遇到这种结果,我一下子困惑了。。。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-03-05 23:33 |只看该作者 |倒序浏览
问题描述:本来想写一个打印矩阵的程序,由于一时疏忽,标红那处代码申请内存时写错了,本来应该申请n*n,但写成了n,于是就出现了很诡异的现象——如果我输入的矩阵宽度为2或3时,就会程序最后释放内存时出错;而3以上就没问题。没想明白原因,还望高人指明啊。。。

#include <iostream>
#include <cerrno>

int main()
{
    using namespace std;

    int n = 0;
    int m = 1;
    int max;
    int row = 0;
    int max_row;
    int column = 0;
    int max_column;
    int i = 0;
    int j = 0;
    int *ptr;

    cout << "Please input the width of the matrix...\n";
    cin >> n;
    // Check of the incoming value
    if (n < 2)
    {
        cout << "The width of the matrix can't less than 2!\n";
        return -1;
    }
    // Init of varibles
    max = n*n;
    max_row = n-1;
    max_column = n-1;
    ptr = new int [n];
    if (NULL == ptr)
    {
        perror("malloc()...");
        return -2;
    }

    // The end of loop is m = max
    for (; m < max; )
    {
        // up loop
        for (i = column; i < max_column; i++)
        {
            cout << n*row+i << endl;
            *(ptr+n*row+i) = m;
            m++;
        }
        // right loop
        for (i = row; i < max_row; i++)
        {
            cout << n*i+max_column << endl;
            *(ptr+n*i+max_column) = m;
            m++;
        }
        // down loop
        for (i = max_column; i > column; i--)
        {
            cout << n*max_row+i << endl;
            *(ptr+n*max_row+i) = m;
            m++;
        }
        // left loop
        for (i = max_row; i > row; i--)
        {
            cout << n*i+column << endl;
            *(ptr+n*i+column) = m;
            m++;
        }

        row++;
        column++;
        max_row--;
        max_column--;

        if (row >= max_row)
        {
            if (n % 2)
            {
                *(ptr+n*row+column) = m;
            }
            break;
        }
    }

    // printf the matrix
    cout << "The matrix is below:\n";

    for (i = 0; i < n; i++)
    {
        for (j = 0; j < n; j++)
        {
            printf("%-4d", *(ptr+n*i+j));
        }
        cout << endl;
    }

    // realse resource
    delete [] ptr;

    return 0;
}

论坛徽章:
0
2 [报告]
发表于 2012-03-06 00:08 |只看该作者
各位XDJM们,给指点下迷津阿。。。~~

论坛徽章:
0
3 [报告]
发表于 2012-03-06 00:09 |只看该作者
大家可以拷程序直接运行,看看现象阿

论坛徽章:
0
4 [报告]
发表于 2012-03-06 08:20 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
5 [报告]
发表于 2012-03-06 09:35 |只看该作者
实际分配给你的内存可能会比你要求的多,为了对齐

论坛徽章:
0
6 [报告]
发表于 2012-03-06 09:47 |只看该作者
hellioncu 发表于 2012-03-06 09:35
实际分配给你的内存可能会比你要求的多,为了对齐


正解
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP