为什么内容打印不好(例如 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)
您必须了解的是,在访问时,数组将转换为指向第一个元素的指针(此处不相关的 4 个例外除外)C11 标准 - 6.3.2.1 其他操作数 - 左值、数组和函数指示符 (p3)
当您尝试使用 初始化时thelist,*lp您正在尝试struct list从lp. 假设你从改变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)