访问/修改结构中的字符串数组

时间:2010-10-25 16:17:35

标签: c arrays pointers structure c-strings

假设我有以下代码:

typedef struct
{
    char **p;
} STRUCT;

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

    return 0;
}

显然不起作用,但它应该显示我想要做的事情。我如何进行结构中字符串数组的初始化,访问,打印等工作?

3 个答案:

答案 0 :(得分:3)

我认为你只有一个*。尝试:

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;
}

第二个程序只为一个字符串指针分配空间;如果你想要一个数组,只需分配适当的空间量。

答案 1 :(得分: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;
}

答案 2 :(得分:0)

您需要知道数组中包含多少个字符串,方法是向结构添加count成员或使用NULL sentinel值。以下示例使用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_stringslength_of_ith_stringith_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);