Sayo哟 2023-03-23 23:26 采纳率: 0%
浏览 33

循环次数的奇偶导致了数组的数据丢失?请帮我解答!

不知道为什么,当输入的字符串s长度为奇数时(也就是change内部循环奇数次时),数组a在change内时仍有值,可以正常输出,但是当程序运行完函数change后主函数内的a却又没有值了,输出很大的负值,但是我并没有用delete[] 释放。
而且当s长度为偶数时,这个情况又没有了,主函数中a仍保留了函数change内的值,可以正常输出。请帮忙解答!
ps: 问题应该是出在change函数内,函数change1~4可以不用认真看就是把a按规则转到temp

//将二维数组按要求进行旋转变换
#include<iostream>
#include<string>
using namespace std;

//将输入数组的数按变化后的顺序存入新的数组得到变换后的情况

int m, n, i, j ;

void change1(int a[][100], int temp[][100])//顺时针九十度:列从右往左,行从上往下
{
    int k = 0, l = 0;
    //行与列数量转换(顺时针转九十度,长宽会调换)
    int t = m;
    m = n;
    n = t;
    //顺时针九十度转换
    for (j = n - 1; j >= 0; j--)
    {
        for (i = 0; i < m; i++)
        {
            temp[i][j] = a[k][l];//转换后的数组行数列数变化规则与转换前不一致,所以设置k,l来控制转换前数组元素的读取
            l++;
            if (l == m)//列数累加到上限则归零且行数++
            {
                k++;
                l = 0;
            }
        }
    }
}
void change2(int a[][100], int temp[][100])//逆时针九十度:列从左往右,行从下往上
{
    int k = 0, l = 0;
    //行与列数量转换
    int t = m;
    m = n;
    n = t;
    //逆时针九十度转换
    for (j = 0; j < n; j++)
    {
        for (i = m - 1; i >= 0; i--)
        {
            temp[i][j] = a[k][l];
            l++;
            if (l == m)
            {
                k++;
                l = 0;
            }
        }
    }
}
void change3(int a[][100], int temp[][100])//左右翻转:行从上往下,列从右往左
{
    int k = 0, l = 0;
    for (i = 0; i < m; i++)
    {
        for (j = n - 1; j >= 0; j--)
        {
            temp[i][j] = a[k][l];
            l++;
            if (l == n)
            {
                k++;
                l = 0;
            }
        }
    }
}
void change4(int a[][100], int temp[][100])//上下翻转:行从下往上,列从左往右
{
    int k = 0, l = 0;
    for (i = m - 1; i >= 0; i--)
    {
        for (j = 0; j < n; j++)
        {
            temp[i][j] = a[k][l];
            l++;
            if (l == n)
            {
                k++;
                l = 0;
            }
        }
    }
}

//用temp按规则接收a内的元素,完成后,再把a释放掉,然后将a指向temp
void change(int a[][100], string s)
{
    char order;
    for (int k = 0; k < s.size(); k++)
    {
        order = s[k];
        int(*temp)[100] = new int[100][100];
        temp[0][0] = 0;
        switch (order)
        {
        case 'A': change1(a, temp); break;
        case 'B': change2(a, temp); break;
        case 'C': change3(a, temp); break;
        case 'D': change4(a, temp); break;
        }
        delete[] a;
        a = temp;
        temp = NULL;
    }
    //change内部输出
    for (i = 0; i < m; i++)
    {
        for (j = 0; j < n; j++)
        {
            cout << a[i][j] << ' ';
        }
            cout << endl;
    }
}

int main()
{
    int(*a)[100] = new int[100][100];
    cin >> m >> n;//m为行数,n为列数
    for(i=0;i<m;i++)
        for (j = 0; j < n; j++)
        {
            cin >> a[i][j];
        }
    string s;
    cin >> s;//控制变换要求的字符串
    change(a, s);//变换函数
        //主函数输出
    for (i = 0; i < m; i++)
    {
        for (j = 0; j < n; j++)
        {
            cout << a[i][j]<<' ';
        }
        cout << endl;
    }
    delete[] a;
    a = NULL;
    return 0;
}

  • 写回答

2条回答 默认 最新

  • IT_service_mesh 2023-03-23 23:37
    关注

    参考GPT和自己的思路:

    出现这种情况的原因可能是因为在函数change中,每次变换后都会重新申请一个新的二维数组temp来接收变换后的值,但是在循环次数为奇数时,最后一次变换完之后a指向的地址已经是一个新的地址了,而main函数中仍然指向之前的地址,所以最后输出的结果就和期望的不一样了。你可以在函数change结束后,将新的a地址返回给main函数来解决这个问题。同时建议将数组的申请和释放放在函数之外进行,这样会更加好维护和调试。

    评论

报告相同问题?

问题事件

  • 创建了问题 3月23日

悬赏问题

  • ¥200 csgo2的viewmatrix值是否还有别的获取方式
  • ¥15 Stable Diffusion,用Ebsynth utility在视频选帧图重绘,第一步报错,蒙版和帧图没法生成,怎么处理啊
  • ¥15 请把下列每一行代码完整地读懂并注释出来
  • ¥15 pycharm运行main文件,显示没有conda环境
  • ¥15 寻找公式识别开发,自动识别整页文档、图像公式的软件
  • ¥15 为什么eclipse不能再下载了?
  • ¥15 编辑cmake lists 明明写了project项目名,但是还是报错怎么回事
  • ¥15 关于#计算机视觉#的问题:求一份高质量桥梁多病害数据集
  • ¥15 特定网页无法访问,已排除网页问题
  • ¥50 如何将脑的图像投影到颅骨上