2012-04-12 6 views
1

これはCプログラミングの問題です。ポインタの指すメモリにアクセスできるように、2次元ポインタを関数外に転送する方法はありますか?

他の関数がf()内に割り当てられたメモリにアクセスできるように、関数f()の外に2次元のポインタを転送する必要があります。とき、私は> 1.

私は入力引数が本当に外関数で使用できるように、2-Dのポインタを行うにはどのように「ここでエラー」でセグメンテーションフォールトを得た

しかし、? *ba = (dp[0]);に何か問題があるとは思わない。

なぜですか?

typedef struct { 
    char* al; /* '\0'-terminated C string */ 
    int sid; 
} strtyp ; 

strtyp *Getali(void) 
{ 
    strtyp *p = (strtyp *) malloc(sizeof(strtyp)) ; 
    p->al = "test al"; 
    p->sid = rand(); 
    return p; 
} 

strtyp *GetNAl(void) 
{ 
    strtyp *p = (strtyp *) malloc(sizeof(strtyp)) ; 
    p->al = "test a"; 
    p->sid = rand(); 
    return p; 
} 

int *getIDs2(strtyp **ba, int *aS , int *iSz) 
{ 
    int *id = (int *) malloc(sizeof(int) * 8) ; 
    *idS = 8 ; 
    int length = 10; 
    int i ; 
    strtyp **dp = (strtyp **) malloc(sizeof(strtyp*)*length) ; 
    for(i = 0 ; i < length ; ++i) 
    { 
     dp[i] = GetNAl(); 
     printf("(*pd)->ali is %s ", (*pd[i]).ali); 
     printf("(*pd)->sid is %d ", (*pd[i]).sid); 
     printf("\n"); 
    } 
    *ba = (dp[0]); 
    for(i = 0 ; i < length ; ++i) 
    { 
     printf("(*ba)->ali is %s ", (*ba[i]).ali); // error here 
     printf("(*ba)->sid is %d ", (*ba[i]).sid); 
     printf("\n"); 
    } 

    *aIs = length ; 
    return id; 
} 
+0

DPが宣言されていますか? –

+0

申し訳ありませんが、タイプミス、ありがとう – user1002288

答えて

4

あなたが呼び出し元の関数にstrtyp **変数を設定したい場合は、引数はこの型へのポインタでなければならない - strtype ***。だからあなたの関数は次のようになります。

int *getIDs2(strtyp ***ba, int *aS, int *iSz) 
{ 
    /* ... */ 
    strtyp **pd = malloc(sizeof pd[0] * length) ; 

    for(i = 0 ; i < length ; ++i) 
    { 
     pd[i] = GetNAl(); 
     printf("(*pd)->ali is %s ", pd[i]->ali); 
     printf("(*pd)->sid is %d ", pd[i]->sid); 
     printf("\n"); 
    } 

    *ba = pd; 

    for(i = 0 ; i < length ; ++i) 
    { 
     printf("(*ba)->ali is %s ", (*ba)[i]->ali); 
     printf("(*ba)->sid is %d ", (*ba)[i]->sid); 
     printf("\n"); 
    } 

    /* ... */ 
} 

...とあなたの発信者は次のようになります。

strtyp **x; 

getIDs2(&x, ...); 
関連する問題