C语言 初始化结构中的数组



在我的项目中,我被要求在动态数据结构中存储我的2D单词数组,然后在其他函数中使用它们用于其他目的,但我很困惑我应该如何做到这一点。我知道如何分别命名它们,比如:

#include <stdio.h>
#include <stdlib.h>
typedef struct Names {
char *name[5];
} Names;
void func(Names y) {
printf("%sn%s", y.name[0], y.name[1]);
}
int main()
{
Names y;
y.name[0] = "John";
y.name[1] = "Luke";
func(y);
return 0;
}

但是如果我想把它作为一个2d数组呢?通常我会用char names[][10] = {"John", "Luke", etc..};,但如何将其存储在结构体中?我的意思是如果我做了

#include <stdio.h>
#include <stdlib.h>
typedef struct Names {
char *name[5][10];
} Names;
void func(Names y) {
printf("%sn%s", y.name[0], y.name[1]);
}
int main()
{
Names y;
y.name[][10] = {"John", "Luke"};
func(y);
return 0;
}

那只会给出错误,没有意义。

这是正式的方法(参见嵌套初始化中的Struct和union初始化):

#include <stdio.h>
typedef struct Names {
const char *name[2][2];
} Names;
void func(Names* y) {
printf("%s, %sn", y->name[0][0], y->name[0][1]);
printf("%s, %sn", y->name[1][0], y->name[1][1]);
}
int main()
{
Names y = { .name={{"John", "Luke"}, {"Jack", "Jim"}}};
func(&y);
return 0;
}

也适用于反向兼容的原因:

#include <stdio.h>
typedef struct Names {
const char *name[2][2];
} Names;
void func(Names* y) {
printf("%s, %sn", y->name[0][0], y->name[0][1]);
printf("%s, %sn", y->name[1][0], y->name[1][1]);
}
int main()
{
Names y = {"John", "Luke", "Jack", "Jim"};
func(&y);
return 0;
}

以上是管理存储在const char指针中的字符串常量,对于长度不超过9chars的变量字符串,后面有一个零终止符,下面的东西将是可能的(我为5和9设置了编译时常量):

#include <stdio.h>
enum {
NAME_COUNT = 5,
NAME_LENGTH = 9
};
typedef struct Names {
char name[NAME_COUNT][NAME_LENGTH+1];
} Names;
void func(Names* y) {
for (int i=0; i<NAME_COUNT; ++i) {
printf("%sn", y->name[i]);
}
}
int main()
{
Names y = { .name={"John", "Olivia", "Luke", "Mary", "Jane" }};
func(&y);
return 0;
}

我认为你可能错过的是char *name[5];不是一个真正的二维数组的词,它是一个数组的5个指针char,然后你使该数组的前两个指针指向两个字符串字面量。在第二个表达式中,你有一个5 × 10的2d数组指针指向char,这些指针中的每一个都可以指向自己的字符串字面量,所以表达式:

y.name[][10] = {"John", "Luke"};

是不正确的,有几个原因,编译器需要知道数组的两个维度,知道你想给哪个指针赋值字符串字面量,知道了这一点,你会注意到赋值表达式没有什么意义。

的例子:

y.name[1][1] = "John"; 

在这里,您将分配字符串字面值"John"指向指针数组索引[1][1]中的指针

现在,如果您想要一个包含5个单词的数组,每个单词包含10个字符,包括空字节,您只需使用:

char name [5][10]

注意,在这个配置中,你不能简单地分配字符串,你需要使用strcpy来复制它们。

strcpy(y.name[0], "John");

最新更新