注册 登录
编程论坛 C语言论坛

普通的二维数组,输入与输出不符,求助!

好烦、 发布于 2020-11-27 22:54, 1618 次点击
#include<stdio.h>
#include<stdlib.h>
int main(void)
{
    int N,M,i,j,k,q,z;
    int *a;// 每个区域容纳人数
    int **p;// 每个人对每个区域的满意
    int s=0,max;//  s是满意度和,max是满意度最大值
    scanf("%d%d",&N,&M);//N是区域数 M是人数
    a=(int *)malloc(sizeof(int)*N);
    p=(int **)malloc(sizeof(int)*M);
    p[0]=(int *)malloc(sizeof(int)*N*M);
    for(i=0;i<M;i++)
        for(j=0;j<N;j++)
            scanf("%d",(*p+i)+j);
    for(i=0;i<M;i++)
        for(j=0;j<N;j++)
            printf("%d ",*((*p+i)+j));
    free(a);
    free(p);
    free(p[0]);
    return 0;
}
只有本站会员才能查看附件,请 登录
2 回复
#2
请输入密码2020-11-28 09:07
    p[0]=(int *)malloc(sizeof(int)*N*M);


意思是给p[0]一个二维数组空间。
通常来说二维数组的地址是连续的,但动态申请二维数组的地址就不一定是连续的了(之所以说不一定,是要看具体分配代码)。
当然,楼主代码事实上是p[0][0]所在的空间的地址和p[0]不是同一个东西了,是在p[0]的基础上再独立分配空间。
因此实现这代码可以这样改:可以在一维数组p[]下面循环分配独立空间。当然这不等价于普通二维数组。只能通过p[]做媒介再调用p[][],就是二维空间地址不连续的。



[此贴子已经被作者于2020-11-28 09:34编辑过]

#3
请输入密码2020-11-28 10:49
太久没敲过动态申请二维数组代码了,都生疏得不成样子了。这种赋值方法凑合看看就好。

程序代码:

#include<stdio.h>
#include<stdlib.h>

#define MALLOC(p,type,size) \
{ \
  p = type malloc(sizeof(p)*(size)); \
   if ( !(p) ) \
        exit( EXIT_FAILURE ); \
}

int main( void )
{
    int** pa = NULL;
    int* p = NULL;
   
    unsigned N;
    unsigned M;
   
    unsigned i;
    unsigned j;
   
    scanf("%u%u",&N,&M);
   
    MALLOC( pa,( int** ), N )
    MALLOC( p,( int* ), N * M )   
   
    for ( i = 0; i != M; ++i )
        pa[i] = &(p[ i * N ]);
        
    for ( i = 0; i != N * M; ++ i )
        scanf("%d",&(p[i]));
        
    for ( i = 0; i != M; ++ i )
        for ( j = 0; j != N; ++ j )
            printf("%-4d%c", pa[i][j], "\n"[ j != N - 1 ]);
   
    free(p);
    free(pa);
   
    return 0;
}
1