我正在尝试将2d数组的第i行值分配给1d数组。这些数组是动态创建的。我的代码是:
#include <stdio.h>
#include <stdlib.h>
#define N 10
#define FRAC 10
int main(int argc, char *argv[]){
int i, j;
double **A, *B;
A=(double**)malloc(sizeof(double)*N);
for (i=0; i<N; i++){
A[i]=(double*)malloc(sizeof(double)*N);
}
for (i=0; i<N; i++){
for(j=0; j<N; j++){
A[i][j]=i*j/FRAC;
}
}
B=A[0];
for(i=0; i<N; i++)
printf("%f\n",B[i]);
system("PAUSE");
return 0;
}
打印B时,所有值均显示为0.0000。这有什么问题?
答案 0 :(得分:3)
如果你看看你的循环:
for (i=0; i<N; i++){
for(j=0; j<N; j++){
A[i][j]=i*j/FRAC;
}
}
您会看到A[0]
中的每个元素都与i == 0
相乘,因此您的B
将全部为零。
如果您指定B = A[1]
并通过将FRAC
定义为10.0
(或通过添加显式强制转换)强制计算进入浮点模式,您将看到printf
更有趣的内容{ {1}}循环。
而且,虽然我在这里,请不要从malloc
投出返回值,这是没有必要的,它经常隐藏错误。您还没有正确分配A
,您应该A = malloc(sizeof(double *) * N)
;幸运的是,double
几乎总是至少与指针一样大。
您程序的修改版本:
#include <stdio.h>
#include <stdlib.h>
#define N 10
#define FRAC 10.0 /* CHANGED */
int main(int argc, char *argv[]) {
int i, j;
double **A, *B;
A = malloc(sizeof(double *) * N);
for(i = 0; i < N; i++) {
A[i] = malloc(sizeof(double) * N);
}
for(i = 0; i < N; i++) {
for(j = 0; j < N; j++) {
/* This is floating point now that FRAC is 10.0 */
A[i][j]= i * j / FRAC;
}
}
B = A[1]; /* A[0] is all 0.0 so we'll look at A[1] instead. */
for(i = 0; i < N; i++)
printf("%f\n", B[i]);
return 0;
}
产生以下内容(比一堆零更有趣,更有启发性):
0.000000
0.100000
0.200000
0.300000
0.400000
0.500000
0.600000
0.700000
0.800000
0.900000
答案 1 :(得分:1)
i*j
和FRAC
都是整数,而在C中,除以两个整数会产生一个整数,丢弃通常所有的小数。
将FRAC
更改为显式为浮点值,例如使用10.0
代替10
。