gpt4 book ai didi

结构中的字符数组

转载 作者:太空宇宙 更新时间:2023-11-04 07:40:19 27 4
gpt4 key购买 nike

如果要将 char*(字符串)数组添加到结构中,语法看起来如何?

例如

struct someStruct
{
char **someStrings;
}

在哪里设置数组的长度限制,例如将 someString 的每个成员设置为有十个字符的限制?

最佳答案

如果您提前知道需要多少个字符串(称为 M)和每个字符串的最大长度(称为 N),那么您只需声明一个 char 的二维数组:

#define M ... // number of strings
#define N ... // max length of each string

struct someStruct
{
char someStrings[M][N+1]; // +1 for 0 terminator
...
};

如果您不知道需要多少个字符串,但知道最大长度,您可以声明一个指向 char 数组的指针:

#define N ...

struct someStruct
{
char (*someStrings)[N+1];
size_t numStrings;
...
};

然后,当你需要分配你的字符串数组时,你会做类似的事情:

struct someStruct s = {NULL, 0};
size_t count = getNumStrings();
s.someStrings = malloc(sizeof *s.someStrings * count);
if (s.someStrings)
s.numStrings = count;

现在您可以将 someStrings 视为字符串数组:

strcpy(s.someStrings[i], "foo");
printf("%s\n", s.someStrings[j]);
s.someStrings[i][j] = 'a';

当你用完数组后,像这样释放内存:

free(s.someStrings);

注意:在处理指向数组的指针时,您必须在应用下标之前取消对指针的引用;给出代码

T (*a)[N];
a = malloc(sizeof *a); // allocates a single N-element array of T

您通常必须编写 (*a)[i] 才能正确访问数组的第 i 个元素(*a[i] 解析为 *(a[i]),这不是我们想要的)。但是请记住,a[0] 等同于 *a;将下标应用于 a 会隐式取消引用它,因此 a[0][i] 等同于 (*a)[i]。如果我们将它分配为

a = malloc(sizeof *a * M); // allocates M N-element arrays of T

然后我们可以将每个数组引用为 a[0]a[1] 等,并将每个数组的每个元素引用为 a[0 ][0]a[0][1] 等。这就是为什么您在上面的代码中看不到任何指针操作的原因。

如果您不知道有多少个字符串或每个字符串的最大长度,您将不得不进行两步分配,如下所示:

struct someStruct
{
char **someStrings;
size_t numStrings;
size_t maxLength;
};

struct someStruct s = {NULL, 0, 0};
size_t count = getNumStrings();
s.maxLength = getMaxLength();
s.someStrings = malloc(sizeof *s.someStrings * count);
if (s.someStrings)
{
size_t i;
s.numStrings = count;
for (i = 0; i < s.numStrings; i++)
{
s.someStrings[i] = malloc(sizeof *s.someStrings[i] * s.maxLength + 1);
if (s.someStrings[i])
// initialize string value here
}
}

同样,您可以将 someStrings 视为普通的二维数组:

strcpy(s.someStrings[i], "foo");
printf("%s", s.someStrings[j]);
s.someStrings[i][j] = 'a';

像分配一样,释放也是一个两步过程:

for (i = 0; i < s.numStrings; i++)
free(s.someStrings[i]);
free(s.someStrings);

请注意,与前两种方法不同,此方法不保证字符串在内存中是连续的。

您必须手动跟踪字符串的数量和每个字符串的最大长度;无法仅从指针值中获取该信息。

关于结构中的字符数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4933882/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com