2012-09-10 108 views
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; 

} 

如何分配W的阵列P,然后printf的w的P计

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

p[][1] = w; 

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

请拨打帮助菜单

+0

你有意使用C99及更高版本的灵活数组成员吗?请注意,'p'是一个结构,而不是一个数组。 –

+0

'paragraph'不是一个完整的类型。这不是真正的C.它可能是一个扩展,但是在C99中,你必须写'word group [0];'我想,然后分配适量的内存。 –

+0

我不知道:( – tcatchy

回答

4

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

+0

这是否意味着使用** p = w; – tcatchy

+0

@ FRU5TR8EDD:是的,该类型将是'char **' –

+0

所以** p = w;我试过了,它没有; t工作:( – tcatchy

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()或串亲戚,和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; 
} 

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

+0

第二个我开始理解,但是对于单词组,如果你把group [30],那么它会如何影响其余的代码。谢谢!!! :) – tcatchy