假设您真的打算使用 C99 中引入的灵活数组成员,您需要编写如下代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef char word[30];
typedef struct {
int num;
word group[];
} paragraph;
int main(void)
{
paragraph *p = malloc(sizeof(*p) + 1 * sizeof(word));
word w = "BLA";
strcpy(p->group[0], w);
printf("Word: %s\n", p->group[0]);
free(p);
return 0;
}
这是适度棘手的代码。避免使用灵活的数组成员,直到您了解所有这些都在做什么。在此之前,group
将段落的成员变为word
:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef char word[30];
typedef struct {
int num;
word group;
} paragraph;
int main(void)
{
paragraph p;
word w = "BLA";
strcpy(p.group, w);
printf("Word: %s\n", p.group);
return 0;
}
关键点仍然是您不能直接分配数组,需要使用strcpy()
or 与字符串的相对值,memmove()
或者可能memcpy()
与其他类型一起使用。您通常可以分配包含数组的结构(尽管您不能对包含灵活数组成员的结构执行此操作),但这是因为您可以进行结构分配并且结构包含数组是巧合。
但是对于词组,如果你放 group[30],这对代码的其余部分有什么影响?
这是按照您的要求执行的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef char word[30];
typedef struct
{
int num;
word group[30];
} paragraph;
int main(void)
{
paragraph p;
word w = "BLA";
strcpy(p.group[0], w);
printf("Word: %s\n", p.group[0]);
return 0;
}
在这个结构下,假设sizeof(int) == 4
,你会发现,sizeof(paragraph) == 904
因为你声明了一个 30 个单词的数组,而每个单词是一个 30 个字符的数组。这种结构将允许您在段落中添加多个单词(而且我写的大多数段落肯定包含多个单词!)。您仍然必须使用strcpy()
将单词 from 复制w
到 的元素p.group
:
int main(void)
{
paragraph p;
word w = "BLA";
strcpy(p.group[0], w);
strcpy(p.group[1], "Porcupine");
strcpy(p.group[2], "Elephant");
p.num = 3;
printf("Word: %s\n", p.group[0]);
printf("Paragraph:");
for (int i = 0; i < p.num; i++)
printf(" %s", p.group[i]);
putchar('\n');
return 0;
}
虽然使用typedef
like并没有错word
,但这不是我通常会做的事情。它很容易导致更多的混乱而不是启蒙。如果您的大部分单词长度明显少于 29 个字符,也可能导致内存浪费。(您有责任确保在数组元素中存储的字不超过 29 个字符(加上终止的空字节)p.group
。) OTOH,64 位软件的内存分配开销很容易导致浪费的空间一个词没有意义。