C中的嵌套数组结构

Cip*_*erX 2 c struct

为什么内容打印不好(例如 Segmentation Fault/NULL)?我将整个嵌套结构(即数组列表 lp)传递给主列表。有什么建议吗?我花了两天时间才明​​白我错在哪里,但没有成功。我想解释一下。

#include <stdio.h>
#include <string.h>

struct list
{
    char *a;
    char *b;
} lp[10];

typedef struct
{
    int k;
    struct list thelist[2];
} palist;

int main()
{

    lp[0].a     = "One";
    lp[0].b     = "Two";

    lp[1].a     = "Three";
    lp[1].b     = "Four";

    palist final_list = {10, *lp};

    printf("%s, %s", final_list.thelist[1].a, final_list.thelist[1].b);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Dav*_*ica 6

您必须了解的是,在访问时,数组将转换为指向第一个元素的指针(此处不相关的 4 个例外除外)C11 标准 - 6.3.2.1 其他操作数 - 左值、数组和函数指示符 (p3)

当您尝试使用 初始化时thelist*lp您正在尝试struct listlp. 假设你从改变intialization{10, *lp}(10, lp)仍然不会起作用,因为现在lp是一个指向您尝试使用初始化数组的第一个元素。

为了适应数组/指针转换,您需要声明thelist指针而不是数组,例如

typedef struct
{
    int k;
    struct list *thelist;
} palist;
Run Code Online (Sandbox Code Playgroud)

(你可以用一个指针初始化一个指针,一切都会好起来的)

现在使用初始化程序{10, lp}将提供一个用于初始化的指针,thelist并且您的赋值将起作用(但您必须跟踪有效元素的数量——final_list[2]....将调用未定义行为,因为元素 2 及以后的元素未初始化)

您的总代码将是:

#include <stdio.h>

struct list
{
    char *a;
    char *b;
} lp[10];

typedef struct
{
    int k;
    struct list *thelist;
} palist;

int main(void) {

    lp[0].a     = "One";
    lp[0].b     = "Two";

    lp[1].a     = "Three";
    lp[1].b     = "Four";

    palist final_list = {10, lp};

    printf("%s, %s\n", final_list.thelist[1].a, final_list.thelist[1].b);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)