小小只123 2022-02-24 11:55 采纳率: 50%
浏览 41

哪位帮我看看为二维数组动态分配那块为什么越界总是触发断点,还有从命令行输入的文件名称执行后到哪里找文件?




```#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<time.h>
#include<string.h>

void run(int argc, char* argv[]);
int judgeone(char* b);
int judgetwo(char* c);
void zhixing(int number, char filename[]);

int main(int argc, char* argv[])
{
    run(argc, argv);
    return 0;
}
void run(int argc, char* argv[]) {
    int number; char filename[100];
    if (argc == 1)                           //不输入命令行参数的情况
    {
        strcpy(filename, "output.txt");
        printf("Please input record number:\n");
        if (scanf("%d", &number) == 1) {
            zhixing(number, filename);
        }
        else {
            printf("input wrong!");
        }
    }
    else if (argc == 3)                      //输入2个命令行参数的情况
    {
        if (judgeone(argv[1]) == 1) {
            number = *argv[1] - '0';
            if (judgetwo(argv[2]) == 1) {
                strcpy(filename, argv[2]);
                zhixing(number, filename);


            }
        }
    }
    else                                                      //输入一个或三个及以上命令行参数的情况
    {
        printf("Too many input parameters\n");
    }

}
int judgeone(char* b)
{                       //判断argv[1]是不是int型,或全是数字
    int i;
    int m = strlen(b);
    for (i = 0; i < m; i++) {
        if (b[i] >= '0' && b[i] <= '9') continue;
        else {
            return 0;
        }
    }return 1;
}
int judgetwo(char* c) //判断用户输入的文件名是否合法
{
    int len = strlen(c);
    if (len < 4)return 0;
```c


    else {
        char* p = &c[len - 4];
        if (strcmp(p, ".txt") != 0) return 0;
        else return 1;
    }
}
void zhixing(int number, char filename[])
{
    int i, j;
    **int** a= (int**)malloc((sizeof(int*))* number);       //申请number行动态内存分配空间
    if (a == NULL) {
        printf("error!");
    }
    else {
        for (i = 0; i < number; i++)
        {
            if ((a[i] = (int*)malloc((sizeof(int)) * 3)) == NULL)       //申请3列动态内存分配空间
            {
                printf("error!");
             }
        }
        srand(time(NULL));
        for (i = 0; i < number; i++) {                     //产生随机数并将生成的随机数存入数组中
            for (j = 0; j < 3; j++)
            {
                 a[i][j]= rand() % 51;
                if (j != 2)   printf("%d,",a[i][j] );
                else printf("%d", a[i][j]);

            }printf("\n");
        }

        FILE* fp;
        if ((fp = fopen(filename, "w")) == NULL)
        {
            printf("can not creat the file\n");
            exit(0);
        }                                           //建立文件指针,将文件指针指向.txt文件
        fprintf(fp, "%d\n", number);                    //将条数参数打印到文件中
        for (int i = 0; i < number; i++)
        {
            for (int j = 0; j < 3; j++)
            {
                if (j != 2)
                    fprintf(fp, "%d,", a[i][j]);  //将int型数字打印到文件中
                else
                    fprintf(fp, "%d", a[i][j]);   //将int型数字打印到文件中
            }
            fprintf(fp, "\n");
        }
        fclose(fp); //关闭文件

        for (i = 0; i < number; i++)
        {
            free(a[i]);                                  //逐个释放指针内存
        }
        free(a);                                         //释放指向指针的二级指针内存

    }
}**
```c


  • 写回答

2条回答 默认 最新

  • yun6853992 2022-02-24 12:10
    关注

    你这种用法是错误的 int **,对于int *的初始化,你可以了解一下,然后理解int ** 是要逐层申请内存,初始化的。

    另外,你打开的文件,如果是linux应该就是和这个可执行文件的同级目录,如果是windows,在生成的项目debug或者release目录里找找。

    你可以试着理解int *a[N];

    img

    img

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 2月24日

悬赏问题

  • ¥66 关于川崎机器人调速问题
  • ¥15 winFrom界面无法打开
  • ¥15 crossover21 ARM64版本安装软件问题
  • ¥15 mymetaobjecthandler没有进入
  • ¥15 mmo能不能做客户端怪物
  • ¥15 osm下载到arcgis出错
  • ¥15 Dell g15 每次打开eiq portal后3分钟内自动退出
  • ¥200 使用python编写程序,采用socket方式获取网页实时刷新的数据,能定时print()出来就行。
  • ¥15 matlab如何根据图片中的公式绘制e和v的曲线图
  • ¥15 我想用Python(Django)+Vue搭建一个用户登录界面,但是在运行npm run serve时报错了如何解决?