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

C 访问/修改结构中的字符串数组,c,arrays,pointers,structure,c-strings,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; } 这显然不起作用,但它应该表明我想做什么。我将如何初始化、访问、打印结构中的字符串数组等?我认为您有两个*,其中您只需要一个。尝试: typedef struct { char *p; } STRUC

假设我有以下代码:

typedef struct
{
    char **p;
} STRUCT;

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

    return 0;
}

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

我认为您有两个
*
,其中您只需要一个。尝试:

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

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

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

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

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

目前没有数组,但我假设您想要创建一个。您需要首先分配所需字符串的任意数量的
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;
}

目前没有数组,但我假设您希望创建一个。您需要首先分配所需字符串的任意数量的
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;
}

您需要通过向结构添加count成员或使用NULL sentinel值来了解数组中包含多少字符串。以下示例使用空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;
}
取消分配:

for (i = 0; s.[i] != NULL; i++)
  free(s.p[i]);
free(s.p);

您需要通过向结构添加count成员或使用NULL sentinel值来了解数组中包含多少字符串。以下示例使用空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;
}
取消分配:

for (i = 0; s.[i] != NULL; i++)
  free(s.p[i]);
free(s.p);

嗯,但是指针也可以被视为数组吗?例如,使用
char**p
,第一个指针指向字符串,第二个指针指向字符串中的字符。@jon2512chua:数组可以被视为指针,而不是相反。除非为指针分配空间,或使其指向现有变量/array.Hmmm,否则不能使用指针存储任何内容,但指针也可以被视为数组吗?例如,使用
char**p
,第一个指针指向字符串,第二个指针指向字符串中的字符。@jon2512chua:数组可以被视为指针,而不是相反。除非为指针分配空间或使其指向现有变量/数组,否则不能使用指针存储任何内容。