gpt4 book ai didi

c - C 中的嵌套数组结构

转载 作者:行者123 更新时间:2023-12-02 19:26:14 25 4
gpt4 key购买 nike

为什么内容打印不好(例如段错误/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;
}

最佳答案

您必须了解的是,在访问时,数组将转换为指向第一个元素的指针(受此处不相关的 4 个异常(exception)影响)C11 Standard - 6.3.2.1 Other Operands - Lvalues, arrays, and function designators(p3)

当您尝试使用 *lp 初始化 thelist 时,您正在尝试从 中的第一个元素初始化 struct list 数组>lp。假设您将初始化从 {10, *lp} 更改为 (10, lp) ,但仍然不起作用,因为现在 lp 是一个指针到您尝试用来初始化数组的第一个元素。

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

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

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

现在使用初始化器{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;
}

关于c - C 中的嵌套数组结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62369935/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com