【问题标题】:Accessing/modifying an array of strings in a structure访问/修改结构中的字符串数组
【发布时间】:2010-10-25 16:17:34
【问题描述】:

假设我有以下代码:

typedef struct
{
    char **p;
} STRUCT;

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

    return 0;
}

这显然不起作用,但它应该显示我想要做什么。我将如何对结构中的字符串数组进行初始化、访问、打印等操作?

【问题讨论】:

    标签: c arrays pointers structure c-strings


    【解决方案1】:

    你有两个*,我想你只想要一个。试试:

    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】:

      目前没有数组,但我假设您想创建一个。您需要首先分配尽可能多的 char *s 字符串:

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

      【讨论】:

      • 嗯,但是指针也不能被视为数组吗? IE。使用char** p,第一个指针指向一个字符串,第二个指针指向字符串中的字符。
      • @jon2512chua:数组可以被认为是一个指针,而不是相反。除非为它分配空间,或者让它指向一个现有的变量/数组,否则你不能使用指针存储任何东西。
      【解决方案3】:

      您将需要知道数组中包含多少个字符串,方法是向结构添加计数成员或使用 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_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);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-03
        • 2020-05-23
        • 1970-01-01
        • 1970-01-01
        • 2018-05-23
        • 1970-01-01
        相关资源
        最近更新 更多