C语言中的数组赋值
如果我已经定义了这一点:C语言中的数组赋值,c,arrays,C,Arrays,如果我已经定义了这一点: 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中打印w 我知道这是错误的,但例如: p[][1] =
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中打印w
我知道这是错误的,但例如:
p[][1] = w;
printf("%s", p[][1]);
请帮助一个noob out数组不可分配。将数组初始化为适当的大小,并根据需要设置每个元素,或者存储一个指针。数组是不可分配的。将数组初始化为适当的大小并根据需要设置每个元素,或者存储指针。如果您真的打算使用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;
}
关键的一点是,您不能直接分配数组,需要使用strcpy()
或带有字符串的亲戚,以及memmove()
或memcpy()
和其他类型。通常,您可以指定包含数组的结构(尽管对于包含灵活数组成员的结构,您不能这样做),但这是因为您可以指定结构,而且结构包含数组是巧合
但是对于wordgroup,如果你把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;
}
虽然像
word
那样使用typedef
并没有错,但我通常不会这么做。这很容易导致比启蒙更大的混乱。如果你的大多数单词长度明显少于29个字符,也可能导致内存浪费。(您有责任确保在p.group
数组元素中存储的字长度不超过29个字符(加上终止的空字节),64位软件的内存分配开销很容易使单个单词的浪费空间变得毫无意义。假设您真的打算使用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;
}
关键的一点是,您不能直接分配数组,需要使用strcpy()
或带有字符串的亲戚,以及memmove()
或memcpy()
和其他类型。通常,您可以指定包含数组的结构(尽管对于包含灵活数组成员的结构,您不能这样做),但这是因为您可以指定结构,而且结构包含数组是巧合
但是对于wordgroup,如果你把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;
}
虽然像
word
那样使用typedef
并没有错,但我通常不会这么做。这很容易导致比启蒙更大的混乱。如果你的大多数单词长度明显少于29个字符,也可能导致内存浪费。(您有责任确保在p.group
数组元素中存储的字长度不超过29个字符(加上终止的空字节),64位软件的内存分配开销很容易使单个单词的浪费空间变得毫无意义。您是否有意使用C99及更高版本的灵活数组成员?请注意,p
是一个结构,而不是数组。段落
不是一个完整的类型。这不是真正的C。它可能是一个扩展,但在C99中,您必须编写词组[0]代码>我认为,然后分配适当的内存量。您是否有意使用C99和更高版本的灵活数组成员?请注意,p
是一个结构,而不是数组。段落
不是一个完整的类型。这不是真正的C。它可能是一个扩展,但在C99中,您必须编写词组[0]代码>我想,然后分配适当的内存。@FRU5TR8EDD:是的,类型应该是char**
@FRU5TR8EDD:是的,因为“BLA”
属于const char*
类型,而不是char**
。您最好稍微研究一下C类型系统。@EdS。不过它们是左值。你的意思可能是“可修改的左值”。@JensGustedt:对不起,谢谢,你是对的;它是一个左值,只是不可赋值。@FRU5TR8EDD:是的,类型应该是char**
@FRU5TR8EDD:是的,因为“BLA”
是const char*
类型,而不是char**
。您最好稍微研究一下C类型系统。@EdS。不过它们是左值。你的意思可能是“可修改的左值”。@JensGustedt:对不起,谢谢,你是对的;它是一个左值,只是不可赋值。第二个我开始理解,但是对于单词group,如果你把group[30]放进去,它会如何影响代码的其余部分。谢谢!!!:)第二个我开始理解了,但是对于单词group,如果你把group[30]放进去,那会对代码的其余部分产生什么影响呢。谢谢!!!:)