Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C语言中的数组赋值_C_Arrays - Fatal编程技术网

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]放进去,那会对代码的其余部分产生什么影响呢。谢谢!!!:)