2017-05-03 6 views
-3
#include <stdio.h> 
#include <stdlib.h> 

int** asd(int map[][7]); 

int main(void) 
{ 
    int **child_map = (int**)malloc(sizeof(int*) * 6); 
    int i, k; 
    for (i = 0; i < 6; i++) 
     child_map[i] = (int*)malloc(sizeof(int) * 7); 


    for (i = 0; i < 6; i++) 
    { 
     for (k = 0; k < 7; k++) 
     { 
      child_map[i][k] = 10; 
     } 
    } 

    for (i = 0; i < 6; i++) 
    { 
     for (k = 0; k < 7; k++) 
     { 
      printf("%3d", child_map[i][k]); 
     } 
     printf("\n"); 
    } 

    int **map = NULL; 
    map = asd(child_map); 

    for (i = 0; i < 6; i++) 
    { 
     for (k = 0; k < 7; k++) 
     { 
      printf("%3d", map[i][k]); 
     } 
     printf("\n"); 
    } 

    return 0; 
} 

int** asd(int map[][7]) 
{ 
    int **a = (int**)malloc(sizeof(int*) * 6); 
    int i, k; 
    for (i = 0; i < 6; i++) 
     a[i] = (int*)malloc(sizeof(int) * 7); 


    for (i = 0; i < 6; i++) 
    { 
     for (k = 0; k < 7; k++) 
     { 
      a[i][k] = map[i][k]; 
     } 
    } 
    return a; 
} 

関数では、[i] [k]とmap [i] [k]はマップされません。配列aの値は99882978のように非常に奇妙です。なぜ機能しないのですか?
私はgoのようなゲームのツリーになっており、各ツリーノードには親のマップのコピーがあります。だから、関数mallocを2次元配列にし、コピーマップの親と戻りポインタのマップをコピーします。しかし、それは動作しません... 私は非常にここにこだわっています...C:関数では、mallocの2次元配列と引数の重複配列が機能しません。

+2

[malloc関数をキャストしていない]何をすべきか(http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc) – Barmar

+0

もしかして?私は理解していません –

+0

'malloc'の前に' int ** child_map = malloc(sizeof(int *)* 6); ''(int **) 'を付けないでください。理由を知るにはリンクをクリックしてください。 – Barmar

答えて

2

child_mapは、ポインタの配列です。 int map[][7]という宣言は、ポインタの配列ではなく、intの2次元配列用です。あなたはへasdを変更する必要があります。

int **asd(int **map) 
+0

これは驚くほど見つけにくいです... –

+0

OPは2次元配列を必要とします。 – Olaf

+0

@Olaf 2D配列を動的に割り当てるのは難しいです。 'malloc(rows * cols * sizeof(int))'で行うことはできますが、 'array [i] [j]'でこれにアクセスすることはできませんので、2Dからリニアアドレッシングに変換する必要があります。 – Barmar

関連する問題