簡體   English   中英

C 中的嵌套數組結構

[英]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));

https://godbolt.org/z/fUjLtE

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM