鱼C论坛

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

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

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

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

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

x
#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[i]=(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[i][j]);
        }
        printf("\n");
    }
    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[i] = malloc(sizeof(*p[i]) * 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[i]) * 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[i]) * 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[i]=(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][j] = m;
            //问题二
            //这里要使用*p+x 方式 该如何修改 ,自己改了半天
            //也不知道用指针咋能寻址
            ++m;
        }
    }
    for(int i = 0; i < n; i++) {
        for(int j = 0; j < n; j++) {
            printf("%4d  ", p[i][j]);
        }
        printf("\n");
    }


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

使用道具 举报

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

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

使用道具 举报

发表于 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[i] = malloc(sizeof(*p[i]) * n);
    }

// ok
#if 0
    p = malloc(sizeof(*p) * n);
    int **bak = p;
    for(size_t i = 0; i < n; ++i) {
        *p++ = malloc(sizeof(*p[i]) * 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[i]) * 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[i]=(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][j] = m;
            //问题二
            //这里要使用*p+x 方式 该如何修改 ,自己改了半天
            //也不知道用指针咋能寻址
            ++m;
        }
    }
    for(int i = 0; i < n; i++) {
        for(int j = 0; j < n; j++) {
            printf("%4d  ", p[i][j]);
        }
        printf("\n");
    }


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

使用道具 举报

发表于 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[i] = malloc(sizeof(*p[i]) * 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[i]) * 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[i]) * 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[i]=(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][j] = m;
            //问题二
            //这里要使用*p+x 方式 该如何修改 ,自己改了半天
            //也不知道用指针咋能寻址
            ++m;
        }
    }
    for(int i = 0; i < n; i++) {
        for(int j = 0; j < n; j++) {
            printf("%4d  ", p[i][j]);
        }
        printf("\n");
    }


    // 释放内存
    // 一定一定一定不要忘了
    for(size_t i = 0; i < n; ++i) free(p[i]);
    free(p);
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> 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
是不是想变二维赋值为一维赋值
试试
*((int*)p+x)=m;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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[i]=(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[i][j]);
        }
        printf("\n");
        
    }
        free(ptmp);
        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
可以,
完成后
别忘了

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

使用道具 举报

发表于 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[i] = malloc(sizeof(*p[i]) * 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[i]) * 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[i]) * 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[i]=(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))[j] = m++;
            //p[i][j] = m;
            //问题二
            //这里要使用*p+x 方式 该如何修改 ,自己改了半天
            //也不知道用指针咋能寻址
            //++m;
        }
    }
    for(int i = 0; i < n; i++) {
        for(int j = 0; j < n; j++) {
            printf("%4d  ", p[i][j]);
        }
        printf("\n");
    }


    // 释放内存
    // 一定一定一定不要忘了
    for(size_t i = 0; i < n; ++i) free(p[i]);
    free(p);
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> 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-11-17 16:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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