コードにはいくつかの問題がありますが、その大部分は、コンパイラの警告を上げることで簡単に特定できます。
最初の問題は、最初の引数としてa をinit_data期待することですが、 a (コンパイラの警告を確認してください)を渡しています。他の場所に割り当てたメモリのブロックを初期化するのではなく、それ自体が割り当てているメモリを初期化しているため、その最初の引数を削除して代わりに a を返すことができます。double**double*** init_datadouble**
また、 に十分な量のメモリを割り当てていませんdata。必要なのは、 ではなくdim_x、 の量に十分なメモリです。の代わりに(type of is )でも実現できます。double* doublesizeof(*data)*datadouble*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;
}