0

次のコードがあるとします。

typedef struct
{
    char **p;
} STRUCT;

int main()
{
    STRUCT s;
    *(s.p) = "hello";
    printf("%s\n", *(s.p));

    return 0;
}

これは明らかに機能しませんが、私がやりたいことを示す必要があります。構造内の文字列の配列の初期化、アクセス、印刷などを行うにはどうすればよいですか?

4

3 に答える 3

3

1つだけ欲しいところに2つ*あると思います。試す:

typedef struct
{
    char *p;
} STRUCT;

int main()
{
    STRUCT s;
    s.p = "hello";
    printf("%s\n", s.p);

    return 0;
}

本当に二重の間接参照が必要な場合は、逆参照するポインターにスペースを割り当てる必要があります。 *(s.p)元のプログラムで、初期化されていないポインターを逆参照します。この場合:

typedef struct
{
    char **p;
} STRUCT;

int main()
{
    STRUCT s;
    s.p = malloc(sizeof(char *));
    *(s.p) = "hello";
    printf("%s\n", *(s.p));
    free(s.p);
    return 0;
}

この 2 番目のプログラムは、1 つの文字列ポインターだけにスペースを割り当てます。配列が必要な場合は、適切な量のスペースを割り当てるだけです。

于 2010-10-25T16:22:20.103 に答える
2

現時点では配列はありませんが、作成したいと思います。最初に必要な数char *の文字列を割り当てる必要があります。

int main()
{
    STRUCT s;
    int N = 10; // number of strings you want
    s.p = (char **)malloc(N * sizeof(char *));
    s.p[0] = "hello";
    s.p[1] = "world";
    ...
    printf("%s\n", s.p[0]);
    free(s.p);

    return 0;
}
于 2010-10-25T16:24:58.240 に答える
0

構造体に count メンバーを追加するか、NULL センチネル値を使用して、配列に含まれる文字列の数を知る必要があります。次の例では、NULL センチネルを使用しています。

割り当てと初期化:

STRUCT s;
s.p = malloc(sizeof *s.p * (number_of_strings + 1));
if (s.p)
{
  size_t i;
  for (i = 0; i < number_of_strings; i++)
  {
    s.p[i] = malloc(length_of_ith_string + 1);
    if (s.p[i])
      strcpy(s.p[i], ith_string);
  }
  s.p[i] = NULL;
}

number_of_stringslength_of_ith_string、およびの適切な値ith_string

アクセス/印刷:

for (i = 0; s.p[i] != NULL; i++)
  printf("String %d: %s\n", i, s.p[i]);

割り当て解除:

for (i = 0; s.[i] != NULL; i++)
  free(s.p[i]);
free(s.p);
于 2010-10-25T16:46:11.157 に答える