【问题标题】:Filling 2D dynamicaly allocated array in C在 C 中填充 2D 动态分配的数组
【发布时间】:2013-02-22 16:15:42
【问题描述】:

有谁知道如何在 C 中填充二维(动态)数组? 我有这个:

double** A;
A = ( double** )malloc( 2*sizeof( double* ));
for (int i = 0; i < 2; i++ ) A[i] = ( double* )malloc( 3 );
A[0][0] = 1;
A[0][1] = 2;
A[0][2] = 3;
A[1][0] = 4;
A[1][1] = 5;
A[1][2] = 6;       
printf("%d", A[1][1]);

但它只打印零...:/

有人帮忙吗?谢了:)

【问题讨论】:

  • ( double* )malloc( 3 ); 需要一个sizeof

标签: c++ c arrays matrix 2d


【解决方案1】:

那个

for (int i = 0; i < 2; i++ ) A[i] = ( double* )malloc( 3 );

分配三个字节A[i]。你需要

for (int i = 0; i < 2; i++ ) A[i] = ( double* )malloc( 3 * sizeof(double) );

由于您分配的空间不足,数组的填充会写入分配的内存之外并调用未定义的行为。

printf("%d", A[1][1]);

尝试使用int 的转换格式打印double,这也会调用未定义的行为。您需要使用%f(或%g%e 或其他一些)转换打印doubles,

printf("%f", A[1][1]);

是你(可能)想要的。

在这种情况下会发生两件常见的事情

  • double 在浮点寄存器中传递,但 printf 读取通用寄存器(x86_64 上常见)
  • printf 读取组成 double 的部分字节并将它们解释为 int(常见于 32 位 x86),因为您存储的 double 值是整数,有效数字有许多零位,并且那么在 little-endian 系统上,printf 读取的位全为零。

【讨论】:

  • 除此之外,你会扔printf("%d", A[1][1]);的UB吗?
  • @kelly 是的,printf 的错误转换将其添加到答案中。
  • 是的,我明白了!非常感谢:)
猜你喜欢
  • 2018-09-07
  • 1970-01-01
  • 2012-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-01
相关资源
最近更新 更多