-1

バージョン 1:

struct mydef_s1 {
    int argc;
    char *argv[3];
};          

struct mydef_s1   *p1 = (struct mydef_s1*) malloc (sizeof (struct mydef_s1));     
p1->argv[0] = malloc (8);
p1->argv[1] = malloc (16);
p1->argv[2] = malloc (24);

Now, I want to achieve above with the following structure declaration?

バージョン 2:

struct mydef_s2 {
    int argc;
    char **argv;
};  

私が正しければ、以下は8バイトだけを割り当てたいと思います(私のマシンのメモリポインタ用に4つと整数用に4つ)

struct mydef_s2   *p2 = (struct mydef_s2*) malloc (sizeof (struct mydef_s2));

次のことを行うにはどうすればよいですか?

p2->argv[0]= malloc(4);
p2->argv[1]=malloc(8);
4

2 に答える 2

0

C のポインターは、配列のように振る舞います。ただし、ポインターへのポインターは、2 次元配列とはまったく異なるものです。

あなたが入力したもの、つまり、(コンパイルされた時点で) 知られていないサイズのポインターの配列を、コンパイルされていない時点で既知のサイズの文字の配列への配列である場合は、まさにそれを行う必要があります。ポインターの配列にストレージを割り当てargv、それを に配置し、実際の文字配列のポインター (おそらく malloc で動的に割り当てられる) で各位置を初期化します。

一方、2 次元配列を意味する場合は、次の 2 つの方法があります。1 つは上記を実行することで、一度に 1 つの malloc に内側の入れ子を割り当てることで、おそらく手順を節約できます。これはメモリの無駄です。

もう 1 つのオプションは、コンパイラが 2 次元配列に対して行うことをシミュレートすることです。n*m 文字を 1 次元配列として割り当て、式 でジャンプしますi = r*m + c。ここrで、 は行インデックス、mは行サイズ、cは列インデックスです。

少し冗長ですが、これは 2 次元配列を定義するときに C が行うことです。また、別の方法よりも割り当て、初期化、および使用が高速です。

于 2016-05-24T10:42:42.433 に答える