5

私は練習として奇妙な質問をしました:

intのポインタのポインタのポインタのポインタのポインタのポインタのポインタのポインタのポインタのポインタのポインタのポインタのポインタのポインタのポインタのポインタをパラメータとしてとり、それに値を代入する関数を書きなさい。

私が書いた関数は正しいと思います(そうでない場合は修正してください)が、どうすればテストできますか?

void function(int *********anInt)
{
    *********anInt = 5;
}

私は試した :

int main(void) {
    int *********nbr = malloc(sizeof(int));
    function(nbr);
    printf("%d", *********nbr);
}

しかし、私はセグメンテーション違反を起こしました。私はそれについて学んだばかりmallocpointersので、完全には理解していません。

4

5 に答える 5

7

試す

int main() {
    int *********nbr;

            nbr = malloc(sizeof(int********));
           *nbr = malloc(sizeof(int*******));
          **nbr = malloc(sizeof(int******));
         ***nbr = malloc(sizeof(int*****));
        ****nbr = malloc(sizeof(int****));
       *****nbr = malloc(sizeof(int***));
      ******nbr = malloc(sizeof(int**));
     *******nbr = malloc(sizeof(int*));
    ********nbr = malloc(sizeof(int));
    function(nbr);
    printf("%d", *********nbr);
}
于 2013-07-18T15:44:25.673 に答える
5

地獄からの割り当てに対応するには、ばかげたメイン プログラムが必要です。

int main(void)
{
    int         l0 = 0;
    int        *l1 = &l0;
    int       **l2 = &l1;
    int      ***l3 = &l2;
    int     ****l4 = &l3;
    int    *****l5 = &l4;
    int   ******l6 = &l5;
    int  *******l7 = &l6;
    int ********l8 = &l7;

    printf("%d %d %d %d %d %d %d %d %d\n", l0, *l1, **l2, ***l3, ****l4, *****l5,
           ******l6, *******l7, ********l8);
    function(&l8);
    printf("%d %d %d %d %d %d %d %d %d\n", l0, *l1, **l2, ***l3, ****l4, *****l5,
           ******l6, *******l7, ********l8);
    return 0;
}

未テスト: 正しいことをカウントしていない可能性がありますが、一般的な考え方は正しいことです。これは、罪のない C プログラマーとコンパイラーにとっての拷問テストです。

于 2013-07-18T15:46:17.713 に答える
2

Anint**は、ポインターを指すポインターです。

int myInt;
int* pInt = &myInt;
int** ppInt = &pInt;

Anint***は、ポインターを指すポインターを指すポインターです。

int*** pppInt = &ppInt;

機能をテストするには、これを適切な回数だけ実行する必要があります。

于 2013-07-18T15:42:32.760 に答える