鱼C论坛

 找回密码
 立即注册
查看: 1382|回复: 13

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

[复制链接]
发表于 2022-5-18 16:47:56 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. #include <stdio.h>
  2. #include <malloc.h>

  3. int main()
  4. {
  5.     int **p;
  6.     int n=0;
  7.     printf("请输入矩阵阶数");
  8.     scanf("%d",&n);
  9.     for(int i=0;i<n;i++)
  10.     {
  11.         p=(int**)malloc(sizeof(int)*n);
  12.     }
  13.     for(int i=0;i<n;i++)
  14.     {
  15.         *(p+i)=(int*)malloc(sizeof(int)*n);
  16.         //问题一、这里使用
  17.         //*p++=(int*)malloc(sizeof(int)*n);  不可以  why?
  18.         //*p=(int*)malloc(sizeof(int)*n);p++   也不可以  why?
  19.         //使用   p[i]=(int*)malloc(sizeof(int)*n);  可以
  20.         //使用 *(p+i)=(int*)malloc(sizeof(int)*n);   可以
  21.     }
  22.     int m=1;
  23.     for(int i=0;i<n;i++)
  24.     {
  25.         for(int j=0;j<n;j++)
  26.         {
  27.             p[i][j]=m;
  28.             //问题二
  29.             //这里要使用*p+x 方式 该如何修改 ,自己改了半天 也不知道用指针咋能寻址
  30.             ++m;
  31.         }
  32.     }
  33.     for(int i=0;i<n;i++)
  34.     {
  35.         for(int j=0;j<n;j++)
  36.         {
  37.             printf("%4d  ",p[i][j]);
  38.         }
  39.         printf("\n");
  40.     }
  41.     return 0;
  42. }
复制代码
最佳答案
2022-5-18 17:49:56
  1. #include <stdio.h>
  2. #include <malloc.h>

  3. int main() {
  4.     int **p;
  5.     int n = 0;
  6.     //printf("请输入矩阵阶数");
  7.     //scanf("%d", &n);
  8.     n = 2;

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

  15. // ok
  16. #if 0
  17.     //p = malloc(sizeof(int *) * n);
  18.     p = malloc(sizeof(*p) * n);
  19.     for(size_t i = 0; i < n; ++i) {
  20.         p[i] = malloc(sizeof(*p[i]) * n);
  21.     }
  22. #endif

  23. // ok
  24. #if 0
  25.     p = malloc(sizeof(*p) * n);
  26.     typeof(p) bak = p;
  27.     for(size_t i = 0; i < n; ++i) {
  28.         *p++ = malloc(sizeof(*p[i]) * n);
  29.     }
  30.     p = bak;
  31. #endif

  32. // ok
  33. #if 1
  34.     p = malloc(sizeof(*p) * n);
  35.     typeof(p) bak = p;
  36.     for(size_t i = 0; i < n; ++i) {
  37.         *p = malloc(sizeof(*p[i]) * n);
  38.         ++p;
  39.     }
  40.     p = bak;
  41. #endif

  42. #if 0
  43.     for(int i = 0; i < n; i++) {
  44.         *(p + i) = (int *)malloc(sizeof(int) * n);
  45.         //问题一、这里使用
  46.         //*p++=(int*)malloc(sizeof(int)*n);  不可以  why?
  47.         //*p=(int*)malloc(sizeof(int)*n);p++   也不可以  why?
  48.         //使用   p[i]=(int*)malloc(sizeof(int)*n);  可以
  49.         //使用 *(p+i)=(int*)malloc(sizeof(int)*n);   可以
  50.     }
  51. #endif
  52.    
  53.     int m = 1;
  54.     for(int i = 0; i < n; i++) {
  55.         for(int j = 0; j < n; j++) {
  56.             *(*(p + i) + j) = m;
  57.             //p[i][j] = m;
  58.             //问题二
  59.             //这里要使用*p+x 方式 该如何修改 ,自己改了半天
  60.             //也不知道用指针咋能寻址
  61.             ++m;
  62.         }
  63.     }
  64.     for(int i = 0; i < n; i++) {
  65.         for(int j = 0; j < n; j++) {
  66.             printf("%4d  ", p[i][j]);
  67.         }
  68.         printf("\n");
  69.     }


  70.     // 释放内存
  71.     // 一定一定一定不要忘了
  72.     for(size_t i = 0; i < n; ++i) free(p[i]);
  73.     free(p);
  74.     return 0;
  75. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-5-18 17:20:28 | 显示全部楼层
没看懂你的代码,这个程序如何使用?
这个代码可以输入1吗?输入1会输出什么?
可不可以输入2?输入2会输出什么?
输入3?
输入4?
输入0可不可以?

就是贴一下这个程序的输入/输出
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-18 17:46:00 | 显示全部楼层
这样?

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

  3. int main() {
  4.     int **p;
  5.     int n = 0;
  6.     //printf("请输入矩阵阶数");
  7.     //scanf("%d", &n);
  8.     n = 2;

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

  15.     //p = malloc(sizeof(int *) * n);
  16.     p = malloc(sizeof(*p) * n);
  17.     for(size_t i = 0; i < n; ++i) {
  18.         p[i] = malloc(sizeof(*p[i]) * n);
  19.     }

  20. // ok
  21. #if 0
  22.     p = malloc(sizeof(*p) * n);
  23.     int **bak = p;
  24.     for(size_t i = 0; i < n; ++i) {
  25.         *p++ = malloc(sizeof(*p[i]) * n);
  26.     }
  27.     p = bak;
  28. #endif

  29. // ok
  30. #if 0
  31.     p = malloc(sizeof(*p) * n);
  32.     int **bak = p;
  33.     for(size_t i = 0; i < n; ++i) {
  34.         *p = malloc(sizeof(*p[i]) * n);
  35.         ++p;
  36.     }
  37.     p = bak;
  38. #endif

  39. #if 0
  40.     for(int i = 0; i < n; i++) {
  41.         *(p + i) = (int *)malloc(sizeof(int) * n);
  42.         //问题一、这里使用
  43.         //*p++=(int*)malloc(sizeof(int)*n);  不可以  why?
  44.         //*p=(int*)malloc(sizeof(int)*n);p++   也不可以  why?
  45.         //使用   p[i]=(int*)malloc(sizeof(int)*n);  可以
  46.         //使用 *(p+i)=(int*)malloc(sizeof(int)*n);   可以
  47.     }
  48. #endif
  49.    
  50.     int m = 1;
  51.     for(int i = 0; i < n; i++) {
  52.         for(int j = 0; j < n; j++) {
  53.             *(*(p + i) + j) = m;
  54.             //p[i][j] = m;
  55.             //问题二
  56.             //这里要使用*p+x 方式 该如何修改 ,自己改了半天
  57.             //也不知道用指针咋能寻址
  58.             ++m;
  59.         }
  60.     }
  61.     for(int i = 0; i < n; i++) {
  62.         for(int j = 0; j < n; j++) {
  63.             printf("%4d  ", p[i][j]);
  64.         }
  65.         printf("\n");
  66.     }


  67.     // 释放内存
  68.     // 一定一定一定不要忘了
  69.     for(size_t i = 0; i < n; ++i) free(p[i]);
  70.     free(p);
  71.     return 0;
  72. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-18 17:49:56 | 显示全部楼层    本楼为最佳答案   
  1. #include <stdio.h>
  2. #include <malloc.h>

  3. int main() {
  4.     int **p;
  5.     int n = 0;
  6.     //printf("请输入矩阵阶数");
  7.     //scanf("%d", &n);
  8.     n = 2;

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

  15. // ok
  16. #if 0
  17.     //p = malloc(sizeof(int *) * n);
  18.     p = malloc(sizeof(*p) * n);
  19.     for(size_t i = 0; i < n; ++i) {
  20.         p[i] = malloc(sizeof(*p[i]) * n);
  21.     }
  22. #endif

  23. // ok
  24. #if 0
  25.     p = malloc(sizeof(*p) * n);
  26.     typeof(p) bak = p;
  27.     for(size_t i = 0; i < n; ++i) {
  28.         *p++ = malloc(sizeof(*p[i]) * n);
  29.     }
  30.     p = bak;
  31. #endif

  32. // ok
  33. #if 1
  34.     p = malloc(sizeof(*p) * n);
  35.     typeof(p) bak = p;
  36.     for(size_t i = 0; i < n; ++i) {
  37.         *p = malloc(sizeof(*p[i]) * n);
  38.         ++p;
  39.     }
  40.     p = bak;
  41. #endif

  42. #if 0
  43.     for(int i = 0; i < n; i++) {
  44.         *(p + i) = (int *)malloc(sizeof(int) * n);
  45.         //问题一、这里使用
  46.         //*p++=(int*)malloc(sizeof(int)*n);  不可以  why?
  47.         //*p=(int*)malloc(sizeof(int)*n);p++   也不可以  why?
  48.         //使用   p[i]=(int*)malloc(sizeof(int)*n);  可以
  49.         //使用 *(p+i)=(int*)malloc(sizeof(int)*n);   可以
  50.     }
  51. #endif
  52.    
  53.     int m = 1;
  54.     for(int i = 0; i < n; i++) {
  55.         for(int j = 0; j < n; j++) {
  56.             *(*(p + i) + j) = m;
  57.             //p[i][j] = m;
  58.             //问题二
  59.             //这里要使用*p+x 方式 该如何修改 ,自己改了半天
  60.             //也不知道用指针咋能寻址
  61.             ++m;
  62.         }
  63.     }
  64.     for(int i = 0; i < n; i++) {
  65.         for(int j = 0; j < n; j++) {
  66.             printf("%4d  ", p[i][j]);
  67.         }
  68.         printf("\n");
  69.     }


  70.     // 释放内存
  71.     // 一定一定一定不要忘了
  72.     for(size_t i = 0; i < n; ++i) free(p[i]);
  73.     free(p);
  74.     return 0;
  75. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-5-18 18:06:35 From FishC Mobile | 显示全部楼层
人造人 发表于 2022-5-18 17:20
没看懂你的代码,这个程序如何使用?
这个代码可以输入1吗?输入1会输出什么?
可不可以输入2?输入2会输 ...

我就是创建一个动态二维数组,然后再随便初始化一下,然后再输出,需求简单的狠
而且我也做出来了,只不过想把下标遍历方式变成用指针遍历
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

*p+x
是不是想变二维赋值为一维赋值
试试
  1. *((int*)p+x)=m;
复制代码

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

使用道具 举报

发表于 2022-5-18 19:28:35 | 显示全部楼层
本帖最后由 风车呼呼呼 于 2022-5-18 19:35 编辑

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

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

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

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

  11.         for (int i = 0; i < n; i++) {
  12.                 for (int j = 0; j < n; j++) {
  13.                         *(*(p + i) + j) = num++;
  14.                 }
  15.         }
  16.         for (int i = 0; i < n; i++) {
  17.                 for (int j = 0; j < n; j++) {
  18.                         printf("%4d", *(*(p + i) + j));
  19.                 }
  20.                 putchar('\n');
  21.         }

  22.         for (int i = 0; i < n; i++) {
  23.                 free(*(p + i));
  24.         }
  25.         free(p);
  26.         return 0;
  27. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-18 19:43:16 | 显示全部楼层
本帖最后由 jhq999 于 2022-5-18 19:48 编辑
  1. int **p,*ptmp=NULL;
  2.     int n=0;
  3.     printf("请输入矩阵阶数");
  4.     scanf("%d",&n);
  5.    
  6.     p=(int**)malloc(sizeof(int*)*n);
  7.     ptmp=(int*)malloc(sizeof(int)*n*n);
  8.     for(int i=0;i<n;i++)
  9.     {
  10.         *(p+i)=ptmp+i*n;
  11.         //问题一、这里使用
  12.         //*p++=(int*)malloc(sizeof(int)*n);  不可以  why?
  13.         //*p=(int*)malloc(sizeof(int)*n);p++   也不可以  why?
  14.         //使用   p[i]=(int*)malloc(sizeof(int)*n);  可以
  15.         //使用 *(p+i)=(int*)malloc(sizeof(int)*n);   可以
  16.     }
  17.     int m=1;
  18.     for(int i=0;i<n;i++)
  19.     {
  20.         for(int j=0;j<n;j++)
  21.         {
  22.             *(*(p+i)+j)=m;
  23.             //问题二
  24.             //这里要使用*p+x 方式 该如何修改 ,自己改了半天 也不知道用指针咋能寻址
  25.             ++m;
  26.         }
  27.     }
  28.     for(int i=0;i<n;i++)
  29.     {
  30.         for(int j=0;j<n;j++)
  31.         {
  32.             printf("%4d  ",p[i][j]);
  33.         }
  34.         printf("\n");
  35.        
  36.     }
  37.         free(ptmp);
  38.         free(p);
复制代码

评分

参与人数 1荣誉 +8 鱼币 +8 贡献 +5 收起 理由
wp231957 + 8 + 8 + 5 感谢楼主无私奉献!

查看全部评分

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

使用道具 举报

 楼主| 发表于 2022-5-19 08:41:16 | 显示全部楼层

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

*(p ++) = (int *)malloc(sizeof(int) * n);
有啥区别???  他们不一样吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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等于原来的首地址
无标题.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-5-19 09:08:14 | 显示全部楼层
jhq999 发表于 2022-5-19 08:53
可以,
完成后
别忘了

嗯,实践了,确实可以
但是又遇到难点了
  1. int m=1;
  2.     for(int i=0;i<N;i++)
  3.     {
  4.         for(int j=0;j<N;j++)
  5.         {
  6.             *(p+i)[j]=m++;     //这里准备用指针和数组的结合体代替p[i][j]或者*(*(p+i)+j)   但是失败,是不能这样结合吗
  7.         }
  8.     }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-19 09:28:27 | 显示全部楼层
wp231957 发表于 2022-5-19 09:08
嗯,实践了,确实可以
但是又遇到难点了
  1. #include <stdio.h>
  2. #include <malloc.h>

  3. int main() {
  4.     int **p;
  5.     int n = 0;
  6.     //printf("请输入矩阵阶数");
  7.     //scanf("%d", &n);
  8.     n = 2;

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

  15. // ok
  16. #if 0
  17.     //p = malloc(sizeof(int *) * n);
  18.     p = malloc(sizeof(*p) * n);
  19.     for(size_t i = 0; i < n; ++i) {
  20.         p[i] = malloc(sizeof(*p[i]) * n);
  21.     }
  22. #endif

  23. // ok
  24. #if 0
  25.     p = malloc(sizeof(*p) * n);
  26.     typeof(p) bak = p;
  27.     for(size_t i = 0; i < n; ++i) {
  28.         *p++ = malloc(sizeof(*p[i]) * n);
  29.     }
  30.     p = bak;
  31. #endif

  32. // ok
  33. #if 1
  34.     p = malloc(sizeof(*p) * n);
  35.     typeof(p) bak = p;
  36.     for(size_t i = 0; i < n; ++i) {
  37.         *p = malloc(sizeof(*p[i]) * n);
  38.         ++p;
  39.     }
  40.     p = bak;
  41. #endif

  42. #if 0
  43.     for(int i = 0; i < n; i++) {
  44.         *(p + i) = (int *)malloc(sizeof(int) * n);
  45.         //问题一、这里使用
  46.         //*p++=(int*)malloc(sizeof(int)*n);  不可以  why?
  47.         //*p=(int*)malloc(sizeof(int)*n);p++   也不可以  why?
  48.         //使用   p[i]=(int*)malloc(sizeof(int)*n);  可以
  49.         //使用 *(p+i)=(int*)malloc(sizeof(int)*n);   可以
  50.     }
  51. #endif
  52.    
  53.     int m = 1;
  54.     for(int i = 0; i < n; i++) {
  55.         for(int j = 0; j < n; j++) {
  56.             //*(*(p + i) + j) = m;
  57.             (*(p + i))[j] = m++;
  58.             //p[i][j] = m;
  59.             //问题二
  60.             //这里要使用*p+x 方式 该如何修改 ,自己改了半天
  61.             //也不知道用指针咋能寻址
  62.             //++m;
  63.         }
  64.     }
  65.     for(int i = 0; i < n; i++) {
  66.         for(int j = 0; j < n; j++) {
  67.             printf("%4d  ", p[i][j]);
  68.         }
  69.         printf("\n");
  70.     }


  71.     // 释放内存
  72.     // 一定一定一定不要忘了
  73.     for(size_t i = 0; i < n; ++i) free(p[i]);
  74.     free(p);
  75.     return 0;
  76. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-5-19 09:41:03 From FishC Mobile | 显示全部楼层
人造人 发表于 2022-5-19 09:28

哦,还得括一下才行啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-19 10:35:32 | 显示全部楼层
wp231957 发表于 2022-5-19 09:41
哦,还得括一下才行啊

所以别嫌麻烦,运算顺序的问题,总比出bug强
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-3-28 20:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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