wp231957 发表于 2022-5-18 16:47:56

关于生成不定长的二维数组的两个疑问(详见贴内)

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

int main()
{
    int **p;
    int n=0;
    printf("请输入矩阵阶数");
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
      p=(int**)malloc(sizeof(int)*n);
    }
    for(int i=0;i<n;i++)
    {
      *(p+i)=(int*)malloc(sizeof(int)*n);
      //问题一、这里使用
      //*p++=(int*)malloc(sizeof(int)*n);不可以why?
      //*p=(int*)malloc(sizeof(int)*n);p++   也不可以why?
      //使用   p=(int*)malloc(sizeof(int)*n);可以
      //使用 *(p+i)=(int*)malloc(sizeof(int)*n);   可以
    }
    int m=1;
    for(int i=0;i<n;i++)
    {
      for(int j=0;j<n;j++)
      {
            p=m;
            //问题二
            //这里要使用*p+x 方式 该如何修改 ,自己改了半天 也不知道用指针咋能寻址
            ++m;
      }
    }
    for(int i=0;i<n;i++)
    {
      for(int j=0;j<n;j++)
      {
            printf("%4d",p);
      }
      printf("\n");
    }
    return 0;
}

人造人 发表于 2022-5-18 17:20:28

没看懂你的代码,这个程序如何使用?
这个代码可以输入1吗?输入1会输出什么?
可不可以输入2?输入2会输出什么?
输入3?
输入4?
输入0可不可以?

就是贴一下这个程序的输入/输出

人造人 发表于 2022-5-18 17:46:00

这样?

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

int main() {
    int **p;
    int n = 0;
    //printf("请输入矩阵阶数");
    //scanf("%d", &n);
    n = 2;

    /*
    // 这个for循环是在做什么?
    for(int i = 0; i < n; i++) {
      p = (int **)malloc(sizeof(int) * n);
    }
    */

    //p = malloc(sizeof(int *) * n);
    p = malloc(sizeof(*p) * n);
    for(size_t i = 0; i < n; ++i) {
      p = malloc(sizeof(*p) * n);
    }

// ok
#if 0
    p = malloc(sizeof(*p) * n);
    int **bak = p;
    for(size_t i = 0; i < n; ++i) {
      *p++ = malloc(sizeof(*p) * n);
    }
    p = bak;
#endif

// ok
#if 0
    p = malloc(sizeof(*p) * n);
    int **bak = p;
    for(size_t i = 0; i < n; ++i) {
      *p = malloc(sizeof(*p) * n);
      ++p;
    }
    p = bak;
#endif

#if 0
    for(int i = 0; i < n; i++) {
      *(p + i) = (int *)malloc(sizeof(int) * n);
      //问题一、这里使用
      //*p++=(int*)malloc(sizeof(int)*n);不可以why?
      //*p=(int*)malloc(sizeof(int)*n);p++   也不可以why?
      //使用   p=(int*)malloc(sizeof(int)*n);可以
      //使用 *(p+i)=(int*)malloc(sizeof(int)*n);   可以
    }
#endif
   
    int m = 1;
    for(int i = 0; i < n; i++) {
      for(int j = 0; j < n; j++) {
            *(*(p + i) + j) = m;
            //p = m;
            //问题二
            //这里要使用*p+x 方式 该如何修改 ,自己改了半天
            //也不知道用指针咋能寻址
            ++m;
      }
    }
    for(int i = 0; i < n; i++) {
      for(int j = 0; j < n; j++) {
            printf("%4d", p);
      }
      printf("\n");
    }


    // 释放内存
    // 一定一定一定不要忘了
    for(size_t i = 0; i < n; ++i) free(p);
    free(p);
    return 0;
}

人造人 发表于 2022-5-18 17:49:56

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

int main() {
    int **p;
    int n = 0;
    //printf("请输入矩阵阶数");
    //scanf("%d", &n);
    n = 2;

    /*
    // 这个for循环是在做什么?
    for(int i = 0; i < n; i++) {
      p = (int **)malloc(sizeof(int) * n);
    }
    */

// ok
#if 0
    //p = malloc(sizeof(int *) * n);
    p = malloc(sizeof(*p) * n);
    for(size_t i = 0; i < n; ++i) {
      p = malloc(sizeof(*p) * n);
    }
#endif

// ok
#if 0
    p = malloc(sizeof(*p) * n);
    typeof(p) bak = p;
    for(size_t i = 0; i < n; ++i) {
      *p++ = malloc(sizeof(*p) * n);
    }
    p = bak;
#endif

// ok
#if 1
    p = malloc(sizeof(*p) * n);
    typeof(p) bak = p;
    for(size_t i = 0; i < n; ++i) {
      *p = malloc(sizeof(*p) * n);
      ++p;
    }
    p = bak;
#endif

#if 0
    for(int i = 0; i < n; i++) {
      *(p + i) = (int *)malloc(sizeof(int) * n);
      //问题一、这里使用
      //*p++=(int*)malloc(sizeof(int)*n);不可以why?
      //*p=(int*)malloc(sizeof(int)*n);p++   也不可以why?
      //使用   p=(int*)malloc(sizeof(int)*n);可以
      //使用 *(p+i)=(int*)malloc(sizeof(int)*n);   可以
    }
#endif
   
    int m = 1;
    for(int i = 0; i < n; i++) {
      for(int j = 0; j < n; j++) {
            *(*(p + i) + j) = m;
            //p = m;
            //问题二
            //这里要使用*p+x 方式 该如何修改 ,自己改了半天
            //也不知道用指针咋能寻址
            ++m;
      }
    }
    for(int i = 0; i < n; i++) {
      for(int j = 0; j < n; j++) {
            printf("%4d", p);
      }
      printf("\n");
    }


    // 释放内存
    // 一定一定一定不要忘了
    for(size_t i = 0; i < n; ++i) free(p);
    free(p);
    return 0;
}

wp231957 发表于 2022-5-18 18:06:35

人造人 发表于 2022-5-18 17:20
没看懂你的代码,这个程序如何使用?
这个代码可以输入1吗?输入1会输出什么?
可不可以输入2?输入2会输 ...

我就是创建一个动态二维数组,然后再随便初始化一下,然后再输出,需求简单的狠
而且我也做出来了,只不过想把下标遍历方式变成用指针遍历

jhq999 发表于 2022-5-18 19:23:18

wp231957 发表于 2022-5-18 18:06
我就是创建一个动态二维数组,然后再随便初始化一下,然后再输出,需求简单的狠
而且我也做出来了,只不 ...

*p+x
是不是想变二维赋值为一维赋值
试试
*((int*)p+x)=m;

风车呼呼呼 发表于 2022-5-18 19:28:35

本帖最后由 风车呼呼呼 于 2022-5-18 19:35 编辑

问题一:p指向所申请的内存空间,p一动(而且最后也不还原)那不是妥妥的内存泄漏
问题二:见代码
#include <stdio.h>

int main(void) {
        int** p, n, num = 0;
        printf("请输出矩阵阶数:");
        scanf("%d", &n);
        printf("正在生成%d阶矩阵!\n", n);

        p=(int **)malloc(sizeof(p)*n);

        for (int i = 0; i < n; i++) {
                *(p + i) = (int *)malloc(sizeof(int) * n);
        }

        for (int i = 0; i < n; i++) {
                for (int j = 0; j < n; j++) {
                        *(*(p + i) + j) = num++;
                }
        }
        for (int i = 0; i < n; i++) {
                for (int j = 0; j < n; j++) {
                        printf("%4d", *(*(p + i) + j));
                }
                putchar('\n');
        }

        for (int i = 0; i < n; i++) {
                free(*(p + i));
        }
        free(p);
        return 0;
}

jhq999 发表于 2022-5-18 19:43:16

本帖最后由 jhq999 于 2022-5-18 19:48 编辑

int **p,*ptmp=NULL;
    int n=0;
    printf("请输入矩阵阶数");
    scanf("%d",&n);
   
    p=(int**)malloc(sizeof(int*)*n);
    ptmp=(int*)malloc(sizeof(int)*n*n);
    for(int i=0;i<n;i++)
    {
      *(p+i)=ptmp+i*n;
      //问题一、这里使用
      //*p++=(int*)malloc(sizeof(int)*n);不可以why?
      //*p=(int*)malloc(sizeof(int)*n);p++   也不可以why?
      //使用   p=(int*)malloc(sizeof(int)*n);可以
      //使用 *(p+i)=(int*)malloc(sizeof(int)*n);   可以
    }
    int m=1;
    for(int i=0;i<n;i++)
    {
      for(int j=0;j<n;j++)
      {
            *(*(p+i)+j)=m;
            //问题二
            //这里要使用*p+x 方式 该如何修改 ,自己改了半天 也不知道用指针咋能寻址
            ++m;
      }
    }
    for(int i=0;i<n;i++)
    {
      for(int j=0;j<n;j++)
      {
            printf("%4d",p);
      }
      printf("\n");
       
    }
        free(ptmp);
        free(p);

wp231957 发表于 2022-5-19 08:41:16

jhq999 发表于 2022-5-18 19:43


可是我还是不知道
*(p + i) = (int *)malloc(sizeof(int) * n);

*(p ++) = (int *)malloc(sizeof(int) * n);
有啥区别???他们不一样吗

jhq999 发表于 2022-5-19 08:53:22

本帖最后由 jhq999 于 2022-5-19 08:55 编辑

wp231957 发表于 2022-5-19 08:41
可是我还是不知道
*(p + i) = (int *)malloc(sizeof(int) * n);



可以,
完成后
别忘了
p=p-n;
让p等于原来的首地址

wp231957 发表于 2022-5-19 09:08:14

jhq999 发表于 2022-5-19 08:53
可以,
完成后
别忘了


嗯,实践了,确实可以
但是又遇到难点了
int m=1;
    for(int i=0;i<N;i++)
    {
      for(int j=0;j<N;j++)
      {
            *(p+i)=m++;   //这里准备用指针和数组的结合体代替p或者*(*(p+i)+j)   但是失败,是不能这样结合吗
      }
    }

人造人 发表于 2022-5-19 09:28:27

wp231957 发表于 2022-5-19 09:08
嗯,实践了,确实可以
但是又遇到难点了

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

int main() {
    int **p;
    int n = 0;
    //printf("请输入矩阵阶数");
    //scanf("%d", &n);
    n = 2;

    /*
    // 这个for循环是在做什么?
    for(int i = 0; i < n; i++) {
      p = (int **)malloc(sizeof(int) * n);
    }
    */

// ok
#if 0
    //p = malloc(sizeof(int *) * n);
    p = malloc(sizeof(*p) * n);
    for(size_t i = 0; i < n; ++i) {
      p = malloc(sizeof(*p) * n);
    }
#endif

// ok
#if 0
    p = malloc(sizeof(*p) * n);
    typeof(p) bak = p;
    for(size_t i = 0; i < n; ++i) {
      *p++ = malloc(sizeof(*p) * n);
    }
    p = bak;
#endif

// ok
#if 1
    p = malloc(sizeof(*p) * n);
    typeof(p) bak = p;
    for(size_t i = 0; i < n; ++i) {
      *p = malloc(sizeof(*p) * n);
      ++p;
    }
    p = bak;
#endif

#if 0
    for(int i = 0; i < n; i++) {
      *(p + i) = (int *)malloc(sizeof(int) * n);
      //问题一、这里使用
      //*p++=(int*)malloc(sizeof(int)*n);不可以why?
      //*p=(int*)malloc(sizeof(int)*n);p++   也不可以why?
      //使用   p=(int*)malloc(sizeof(int)*n);可以
      //使用 *(p+i)=(int*)malloc(sizeof(int)*n);   可以
    }
#endif
   
    int m = 1;
    for(int i = 0; i < n; i++) {
      for(int j = 0; j < n; j++) {
            //*(*(p + i) + j) = m;
            (*(p + i)) = m++;
            //p = m;
            //问题二
            //这里要使用*p+x 方式 该如何修改 ,自己改了半天
            //也不知道用指针咋能寻址
            //++m;
      }
    }
    for(int i = 0; i < n; i++) {
      for(int j = 0; j < n; j++) {
            printf("%4d", p);
      }
      printf("\n");
    }


    // 释放内存
    // 一定一定一定不要忘了
    for(size_t i = 0; i < n; ++i) free(p);
    free(p);
    return 0;
}

wp231957 发表于 2022-5-19 09:41:03

人造人 发表于 2022-5-19 09:28


哦,还得括一下才行啊

jhq999 发表于 2022-5-19 10:35:32

wp231957 发表于 2022-5-19 09:41
哦,还得括一下才行啊

所以别嫌麻烦,运算顺序的问题,总比出bug强
页: [1]
查看完整版本: 关于生成不定长的二维数组的两个疑问(详见贴内)