【问题标题】:Initialize array within a structure在结构中初始化数组
【发布时间】:2021-04-30 10:09:59
【问题描述】:

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

#include <stdio.h>
#include <stdlib.h>

typedef struct Names {
    char *name[5];
} Names;

void func(Names y) {
    printf("%s\n%s", y.name[0], y.name[1]);
}

int main()
{
    Names y;
    y.name[0] = "John";
    y.name[1] = "Luke";
    func(y);

    return 0;
}

但是,如果我想将其作为二维数组来做呢?所以通常我会做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("%s\n%s", y.name[0], y.name[1]);
}

int main()
{
    Names y;
    y.name[][10] = {"John", "Luke"};
    func(y);

    return 0;
}

那只会给出错误而且毫无意义。

【问题讨论】:

标签: c struct initialization


【解决方案1】:

这是官方的做法(见Nested initialization in: Struct and union initialization):

#include <stdio.h>

typedef struct Names {
    const char *name[2][2];
} Names;

void func(Names* y) {
    printf("%s, %s\n", y->name[0][0], y->name[0][1]);
    printf("%s, %s\n", 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, %s\n", y->name[0][0], y->name[0][1]);
    printf("%s, %s\n", y->name[1][0], y->name[1][1]);
}

int main()
{
    Names y = {"John", "Luke", "Jack", "Jim"};
    func(&y);

    return 0;
}

上面是管理存储在 const char 指针中的字符串常量,对于最多 9 个 chars lentgh 的可变字符串,带有尾随零终止符,类似以下的内容是可能的(我为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("%s\n", y->name[i]);
    }
}

int main()
{
    Names y = { .name={"John", "Olivia", "Luke", "Mary", "Jane" }};
    func(&y);

    return 0;
}

【讨论】:

  • 非常感谢 :)
  • 如果我有另一个函数void func2(something);。在我的void func(Names *y); 中,我想像这样调用func2 函数func2(y-&gt;name[0][0]); 只需将该名称传递给另一个函数,func2(something); 应该接受什么而不是something
  • @Norbertas 你的意思是如何访问结构的嵌入字符串成员之一的地址?
  • 是的,例如(谈论您的第一个代码示例)我想将func 中的“John”传递给func2,应该如何声明func2?喜欢func2(char name[0][5])?所以它包含一个5个字符的单词?
  • @Norbertas 访问结构中的ith 名称由&amp;y-&gt;name[i] 完成。
【解决方案2】:

我认为您可能缺少的是 char *name[5]; 并不是一个真正的二维单词数组,它是一个由 5 个指向 char 的指针组成的数组,然后您将该数组的两个第一个指针指向两个字符串文字.在第二个表达式中,您有一个 5 x 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");

【讨论】:

    猜你喜欢
    • 2012-05-02
    • 1970-01-01
    • 2015-07-29
    • 1970-01-01
    • 1970-01-01
    • 2010-09-23
    • 2010-12-06
    相关资源
    最近更新 更多