1

これは C プログラミングの問題です。

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

しかし、i > 1 の場合、「ここでエラー」でセグメンテーション違反が発生しました。

入力引数が外部関数で実際に使用できるように、2次元ポインタを実行するにはどうすればよいですか? 私はそれ*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; 
}
4

1 に答える 1

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, ...);
于 2012-04-12T04:50:34.557 に答える