鱼C论坛

 找回密码
 立即注册
查看: 1983|回复: 7

[已解决]谁能帮我来改改这个程序,一运行就出错

[复制链接]
发表于 2021-4-7 19:31:56 | 显示全部楼层 |阅读模式
10鱼币
本帖最后由 学C的大叔 于 2021-4-7 19:43 编辑

我用dev-C++运行这个程序时,在未创建矩阵的矩阵的时候,选择ins 等于2,3,4,或者5的时候,此时ptr == NULL,这个时候应该执行这条语句 printf("未检测到矩阵,请先生成矩阵!\n");,但是程序运行却是出错,这是为什么啊?如何改才能不报错啊,请大侠赐教,谢谢
#include <stdio.h>
#include <stdlib.h>

#define MAX_LIMIT_MATRIX 100

void welcome(void);
int get_ins(void);
int *create_matrix(void);
void init_matrix(int *ptr);
void print_matrix(int *ptr);
void write_matrix(int *ptr);
void read_matrix(int *ptr);

void welcome(void)
{
        printf("\n============================\n");
        printf("* 欢迎使用该程序,指令如下 *\n");
        printf("* 1.生成一个 M*N 的矩阵    *\n");
        printf("* 2.初始化矩阵             *\n");
        printf("* 3.给矩阵中某个元素赋值   *\n");
        printf("* 4.读取矩阵中某个元素     *\n");
        printf("* 5.打印整个矩阵           *\n");
        printf("* 6.结束程序               *\n");
        printf("============================\n");
}

int get_ins(void)
{
        int ins;

        printf("\n请输入指令:");
        scanf("%d", &ins);

        while (ins < 1 || ins > 6)
        {
                printf("\n指令错误,请重新输入:");
                scanf("%d", &ins);
        }

        return ins;
}

int *create_matrix(void)
{
        int m, n;
        static int created = 0; // 用于判断是否已经创建过矩阵
        static int *ptr = NULL;

        if (created)
        {
                printf("矩阵已存在,是否需要重新创建?(Y/N)-> ");
                getchar(); // 清除缓冲区残留的换行符
                while (getchar() == 'N')
                {
                        return ptr;
                }
        }

        printf("请输入新矩阵的规模(M*N)-> ");
        scanf("%d*%d", &m, &n);

        while (m < 1 || n < 1)
        {
                printf("规模太小,请重新输入:");
                scanf("%d*%d", &m, &n);
        }

        while (m > MAX_LIMIT_MATRIX || n > MAX_LIMIT_MATRIX)
        {
                printf("规模太大,请重新输入:");
                scanf("%d*%d", &m, &n);
        }

        // 虽然说是矩阵是二维数组,但在C语言中它的存放形式是“平铺”的
        // 这里用realloc,支持重新创建二维数组
        // 这里多申请了两个整形空间,用于存放矩阵的长和宽
        ptr = (int *)realloc(ptr, (m * n + 2)* sizeof(int));
        if (ptr == NULL)
        {
                printf("内存申请失败!\n");
                exit(1);
        }

        printf("%d*%d 的矩阵创建成功!\n", m, n);
        created = 1;

        // 将长和宽放在前两个元素中
        ptr[0] = m;
        ptr[1] = n;

        return ptr;
}

void init_matrix(int *ptr)
{
        int m = ptr[0];
        int n = ptr[1];
        int *matrix = ptr + 2;
        int num, i, j;

        if (ptr == NULL)
        {
                printf("未检测到矩阵,请先生成矩阵!\n");
                return ;
        }

        printf("请输入一个数字:");
        scanf("%d", &num);

        for (i = 0; i < m; i++)
        {
                for (j = 0; j < n; j++)
                {
                        matrix[i * n + j] = num;
                }
        }
}

void print_matrix(int *ptr)
{
        int m = ptr[0];
        int n = ptr[1];
        int *matrix = ptr + 2;
        int i, j;

        if (ptr == NULL)
        {
                printf("未检测到矩阵,请先生成矩阵!\n");
                return ;
        }

        for (i = 0; i < m; i++)
        {
                for (j = 0; j < n; j++)
                {
                        printf("%d  ", matrix[i * n + j]);
                }
                putchar('\n');
        }
}

void write_matrix(int *ptr)
{
        int m = ptr[0];
        int n = ptr[1];
        int *matrix = ptr + 2;
        int num, x, y;

        if (ptr == NULL)
        {
                printf("未检测到矩阵,请先生成矩阵!\n");
                return ;
        }

        printf("请输入要修改的位置(行,列)-> ");
        scanf("%d,%d", &x, &y);

        if (x > m || y > n || x < 1 || y < 1)
        {
                printf("坐标输入有误!\n");
                return ;
        }

        printf("请输入一个数字:");
        scanf("%d", &num);

        matrix[(x - 1) * n + (y - 1)] = num;
}

void read_matrix(int *ptr)
{
        int m = ptr[0];
        int n = ptr[1];
        int *matrix = ptr + 2;
        int num, x, y;

        if (ptr == NULL)
        {
                printf("未检测到矩阵,请先生成矩阵!\n");
                return ;
        }

        printf("请输入要读取的位置(行,列)-> ");
        scanf("%d,%d", &x, &y);

        if (x > m || y > n || x < 1 || y < 1)
        {
                printf("坐标输入有误!\n");
                return ;
        }

        printf("第%d行,第%d列的数字是:%d\n", x, y, matrix[(x - 1) * n + (y - 1)]);
}

int main(void)
{
        int ins;
        int *ptr = NULL;

        welcome();

        while((ins = get_ins()) != 6)
        {
                switch(ins)
                {
                        case 1: ptr = create_matrix(); break;
                        case 2: init_matrix(ptr); break;
                        case 3: write_matrix(ptr); break;
                        case 4: read_matrix(ptr); break;
                        case 5: print_matrix(ptr); break;
                }
        }

        printf("\n感谢使用本程序^_^\n\n");

        free(ptr);

        return 0;
}
最佳答案
2021-4-7 19:31:57
void init_matrix(int *ptr)
{
        //这里提到前面来判断
        if (ptr == NULL)
        {
                printf("未检测到矩阵,请先生成矩阵!\n");
                return ;
        }

        //这里ptr为NULL,你却提前使用第0个元素,所以报错
        int m = ptr[0];
        int n = ptr[1];
        int *matrix = ptr + 2;
        int num, i, j;

        printf("请输入一个数字:");
        scanf("%d", &num);

        for (i = 0; i < m; i++)
        {
                for (j = 0; j < n; j++)
                {
                        matrix[i * n + j] = num;
                }
        }
}

其他的选项也是一样的  判断都要提前

最佳答案

查看完整内容

其他的选项也是一样的 判断都要提前
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-4-7 19:31:57 | 显示全部楼层    本楼为最佳答案   
void init_matrix(int *ptr)
{
        //这里提到前面来判断
        if (ptr == NULL)
        {
                printf("未检测到矩阵,请先生成矩阵!\n");
                return ;
        }

        //这里ptr为NULL,你却提前使用第0个元素,所以报错
        int m = ptr[0];
        int n = ptr[1];
        int *matrix = ptr + 2;
        int num, i, j;

        printf("请输入一个数字:");
        scanf("%d", &num);

        for (i = 0; i < m; i++)
        {
                for (j = 0; j < n; j++)
                {
                        matrix[i * n + j] = num;
                }
        }
}

其他的选项也是一样的  判断都要提前
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-4-7 20:25:23 | 显示全部楼层
yuxijian2020 发表于 2021-4-7 19:31
其他的选项也是一样的  判断都要提前

谢谢哥们,万分感谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-4-7 20:37:51 | 显示全部楼层
本帖最后由 学C的大叔 于 2021-4-7 20:43 编辑
yuxijian2020 发表于 2021-4-7 19:31
其他的选项也是一样的  判断都要提前


兄台,再请教一下
int *create_matrix(void)
{
        int m, n;
        static int created = 0; // 用于判断是否已经创建过矩阵
        static int *ptr = NULL;
这里为啥要加上static啊?我发现把他去掉,程序也可以运行,没有什么变化
应该int *ptr = NULL前的static是多余的,ptr本身就是指向堆上的空间,不同函数之间可以相互访问,int created = 0 前面加static是使他的生存期变成长,其实可以将created设成全局变量替换,是不是这样理解
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-4-7 20:52:03 | 显示全部楼层
学C的大叔 发表于 2021-4-7 20:37
兄台,再请教一下
int *create_matrix(void)
{

全局变量在程序运行时就立刻初始化,静态变量在函数调用的时候才初始化
在你的程序里差别不大
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-4-7 20:53:30 | 显示全部楼层
yuxijian2020 发表于 2021-4-7 20:52
全局变量在程序运行时就立刻初始化,静态变量在函数调用的时候才初始化
在你的程序里差别不大

谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-4-7 20:55:28 | 显示全部楼层
静态变量只能在定义的函数内部访问,使用范围也是有区别的....
唯一相同的可能就是生命周期了...
建议你看一下静态变量的说明
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-4-7 21:17:23 | 显示全部楼层
yuxijian2020 发表于 2021-4-7 20:55
静态变量只能在定义的函数内部访问,使用范围也是有区别的....
唯一相同的可能就是生命周期了...
建议你看 ...

好的,谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-21 19:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表