0

如果我定义了这个:

typedef char word[30];
typedef struct {
    int num;
    word group[30];
} paragraph;

然后在体内:

int

main(int argc, char **argv) {

    paragraph p;

    word w = "BLA";

    return 0;

}

如何在数组 p 中分配 w,然后根据 p 分配 printf w

我知道这是错误的,但例如:

    p[][1] = w;

    printf("%s", p[][1]);

请帮助一个菜鸟

4

2 回答 2

4

数组不可赋值。将您的数组初始化为适当的大小并根据需要设置每个元素或存储一个指针。

于 2012-09-10T00:15:23.647 回答
2

假设您真的打算使用 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;
}

虽然使用typedeflike并没有错word,但这不是我通常会做的事情。它很容易导致更多的混乱而不是启蒙。如果您的大部分单词长度明显少于 29 个字符,也可能导致内存浪费。(您有责任确保在数组元素中存储的字不超过 29 个字符(加上终止的空字节)p.group。) OTOH,64 位软件的内存分配开销很容易导致浪费的空间一个词没有意义。

于 2012-09-10T00:27:56.337 回答