Доступ / изменение массива строк в структуре - PullRequest
0 голосов
/ 25 октября 2010

Предположим, у меня есть следующий код:

typedef struct
{
    char **p;
} STRUCT;

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

    return 0;
}

, который явно не работает, но должен показать, что я хочу сделать.Как бы я мог инициализировать, получить доступ, распечатать и т. Д. Массив строк в структуре?

Ответы [ 3 ]

3 голосов
/ 25 октября 2010

У вас есть два *, где вы хотите только один, я думаю. Попробуйте:

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 голосов
/ 25 октября 2010

На данный момент нет массива, но я предполагаю, что вы хотите его создать.Сначала нужно выделить столько 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;
}
0 голосов
/ 25 октября 2010

Вам нужно будет узнать, сколько строк содержится в массиве, либо добавив элемент count в структуру, либо используя значение часового значения NULL.В следующих примерах используется NULL sentinel:

Выделение и инициализация:

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_strings, length_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);
...