Если вы посмотрите на свой цикл:
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
.
И, пока я здесь, пожалуйста, не приводите возвращаемое значение из 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