假设你真的打算使用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()
或串亲戚,和memmove()
或许memcpy()
与其他类型。一般来说,您可以指定包含数组的结构(尽管您不能使用包含灵活数组成员的结构来完成此操作),但这是因为您可以执行结构赋值,而且巧合的是结构包含数组。
但是对于字组,如果你把集团[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()
这个词从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
像word
,这是不是我通常会做。它可能很容易导致比启蒙更混乱。如果你的单词大部分少于29个字符,它也可能导致内存浪费。 (您有责任确保您不会在p.group
数组元素中存储长度超过29个字符(加上终止空字节)的单词。)OTOH,64位软件的内存分配开销很容易导致浪费的空间为一个单词模拟。
你有意使用C99及更高版本的灵活数组成员吗?请注意,'p'是一个结构,而不是一个数组。 –
'paragraph'不是一个完整的类型。这不是真正的C.它可能是一个扩展,但是在C99中,你必须写'word group [0];'我想,然后分配适量的内存。 –
我不知道:( – tcatchy