【问题标题】:Reading the input to a two dimensional array created using malloc将输入读取到使用 malloc 创建的二维数组
【发布时间】:2016-07-20 16:04:45
【问题描述】:

`亲爱的朋友们, 我试图通过 malloc 使用虚拟变量 m 定义一个名为 A 的二维数组。变量 A 已初始化为 0。 预计在运行后会将新值分配给矩阵。但这不会发生在这里。我想了解这样做的正确方法。我还尝试了dynamic memory allocation in 2d array and using scanf 中描述的方法,也避免了强制转换 malloc。 这是代码

#include<stdio.h>
#include<math.h>
#include<conio.h>
#include<stdlib.h>
double** Allocate(int d1,int d2);
double** Allocate(int d1,int d2)
{  
  double **m;
  int i,j;
  m = (double**)malloc(sizeof(double*)*d1);  
  for(i=0;i<d1;i++)
  {
    m[i]=(double*)malloc(sizeof(double)*d2);
  }
  for(i=0;i<d1;i++)
  {
    for(j=0;j<d2;j++)
    {
        m[i][j]=0.0;
    }
  }
  return m;
 }
 main()
{
int i,j;
int n=3;
float x[n],y[n];
double** A= Allocate(n,n);  
    for(i=0;i<=n-1;i++)
   {
    for(j=0;j<=n-1;j++)
    {
     scanf("%f",&A[i][j]);
    }
  }
  for(i=0;i<=n-1;i++)
   {
    for(j=0;j<=n-1;j++)
    {
     printf("%f\t",A[i][j]);
    }printf("\n");
  }
 }

【问题讨论】:

  • 不要转换malloc的结果,也不要忘记检查NULL
  • scanf("%f",&amp;A[i][j]); 使用%lffor double --> scanf("%lf",&amp;A[i][j]);
  • 可能更好的方法是让 double Array[d1][d2]; 后跟 *double *ArrayPointer=malloc(d1*d2*sizeof(double)); * ,然后从那里继续。
  • @JonathonReinhart 在现代系统上,检查它的 null 保证没有什么特别的。
  • @n.m.需要详细说明吗?您是否建议我们停止检查 malloc 的结果 NULL

标签: c


【解决方案1】:
  • 您在此处使用错误的格式说明符来扫描double 类型变量:

    scanf("%f",&A[i][j]);
            ^ 
    
  • 正确的格式说明符是%lf,所以改为扫描到数组中:

    scanf("%lf",&A[i][j]);
    

  • 在使用printf() 时不需要使用%lf,因为@Robᵩcomment 中建议:

printf() 中,%f%lf 相同。两者都接受double

要了解更多信息,请参阅:click


  • 此外,不要使用main(),因为它不是main() 的有效签名,而是使用int main(void),因为在标准C 中,main 的唯一有效签名是:

    int main(void) //when arguments are not required
    
  • 还有,

    int main(int argc, char **argv) //当你需要发送参数时

要了解更多信息,请参阅:click


  • 并始终确保在最后释放分配的内存

      ..........  
         printf("%lf\t",A[i][j]);
        }printf("\n");
      }
    
      //freeing the malloced memory
      for(i=0; i<n; i++)
      {
          free(A[i]);
      }
      free(A);
    
    }//end of main
    

进行上述更改后,您的 main() 函数将是:

int main(void)
{
    int i,j;
    int n=3;

    double** A= Allocate(n,n);

    for(i=0;i<=n-1;i++)
    {
        for(j=0;j<=n-1;j++)
        {
            scanf("%lf",&A[i][j]);
        }
    }

    for(i=0;i<=n-1;i++)
    {
        for(j=0;j<=n-1;j++)
        {
             printf("%f\t",A[i][j]);
        }
        printf("\n");
     }

      for(i=0; i<n; i++)
      {
          free(A[i]);
      }
      free(A);
 }

【讨论】:

  • 你是绝对正确的 w.r.t. scanf()。但是,在printf() 中,%f%lf 相同。两者都接受double
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-10
  • 1970-01-01
  • 1970-01-01
  • 2019-03-18
  • 2011-10-30
  • 2015-08-13
相关资源
最近更新 更多