假设我有以下代码:
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;
}
第二个程序只为一个字符串指针分配空间;如果你想要一个数组,只需分配适当的空间。
目前没有数组,但我假设您想创建一个。您需要首先分配尽可能多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;
}
您将需要知道数组中包含多少个字符串,方法是向结构添加计数成员或使用 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);