[英]Nested array struct in C
為什么內容打印不好(例如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;
}
您必須了解的是,在訪問時,數組將轉換為指向第一個元素的指針(受 4 個與此處無關的例外的影響) C11 標准 - 6.3.2.1 其他操作數 - 左值、arrays 和 function 指示符(p3)
當您嘗試使用*lp
thelist
列表時,您正在嘗試從lp
中的第一個元素初始化struct list
數組。 假設您將初始化從{10, *lp}
更改為(10, lp)
仍然不起作用,因為現在lp
是指向您嘗試用來初始化數組的第一個元素的指針。
為了適應數組/指針轉換,您需要將thelist
為指針而不是數組,例如
typedef struct
{
int k;
struct list *thelist;
} palist;
(你可以用指針初始化指針,一切都會好起來的)
現在使用初始化器{10, lp}
將為列表的初始化提供一個指針,並且您的分配將起作用(但您必須跟蹤有效元素的數量 - thelist
final_list[2]....
將調用Undefined元素 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;
}
還有許多其他方法可以用數組的形式初始化或分配這個列表
typedef struct
{
int k;
struct list thelist[2];
} palist;
例如
palist final_list = {10, {lp[0], lp[1]}};
final_list = (palist){10, {lp[0], lp[1]}};
final_list = (palist){10,};
memcpy(final_list.thelist, lp, sizeof(final_list.thelist));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.