コードにはいくつかの問題がありますが、その大部分は、コンパイラの警告を上げることで簡単に特定できます。
最初の問題は、最初の引数としてa をinit_data
期待することですが、 a (コンパイラの警告を確認してください)を渡しています。他の場所に割り当てたメモリのブロックを初期化するのではなく、それ自体が割り当てているメモリを初期化しているため、その最初の引数を削除して代わりに a を返すことができます。double**
double***
init_data
double**
また、 に十分な量のメモリを割り当てていませんdata
。必要なのは、 ではなくdim_x
、 の量に十分なメモリです。の代わりに(type of is )でも実現できます。double*
double
sizeof(*data)
*data
double*
sizeof(double*)
data = malloc(sizeof(*data) * dim_x);
dim_x
double*
data
には がありdim_y
double
、これらの のそれぞれが指すメモリ ブロックには があるためdouble*
、最初のループは まで反復しdim_x
、2 番目のループは まで反復する必要がありますdim_y
。
また、Cでmalloc
(casting a ) の結果をキャストする必要はありません。void*
このサイトには、そうしない方がよい理由を説明する回答があります。
もう 1 つの問題は、printf
書式指定子に関係しています。%d
は 用int
、%f
は 用double
(%lf
使用時scanf
) に使用されます。
free
割り当てられたメモリにコードを追加し、 valgrindなどでプログラムを実行すると、メモリ内で何も悪いことをしていないことがわかります。
作業コードは次のようになります。
#include <stdio.h>
#include <stdlib.h>
double** init_data(int dim_x, int dim_y) {
int i,j,k;
double **data = malloc(sizeof(*data) * dim_x); /* hoping not NULL */
for (k = 0; k < dim_x; k++) {
data[k] = malloc(sizeof(**data) * dim_y); /* hoping not NULL */
}
for (i = 0; i < dim_y; i++) {
for (j = 0; j < dim_y; j++) {
data[i][j] = ((double)rand()/(double)RAND_MAX);
}
}
return data;
}
int main(void)
{
double **dataA;
int i, j, dim = 10;
dataA = init_data(dim, dim);
for(i=0; i < dim; i++)
for(j=0; j < dim; j++)
printf("%f\n", dataA[i][j]);
for (i = 0; i < dim; i++)
free(dataA[i]);
free(dataA);
return 0;
}