簡體   English   中英

傳遞結構指針后無法獲取結構

[英]Not able to obtain struct after passing in struct pointer

我在函數query遇到錯誤。 它沒有返回結果。 該函數generate將初始化結果。 由函數query調用。

//定義結構

#define MAX 50

typedef struct {
    char I[50];
    char name[10];
} object;


typedef struct {
    int num_items;
    object items[MAX];
} arg_t;

//函數生成

void generate (object *q) {
    // initialize
    object objectArray[] = {
        {
        .I = "1",
        .name = "John"
        }, // item 1
        {
        .I = "2",
        .name = "Jane"
        }, // item 2
    };

    q = malloc(sizeof(arg_t));

    q->num_items = 2;
    printf("There are %d of elements in the record.\n", q->num_items);
    memcpy(q->items, object, sizeof(object) * q->num_items);

    int i =0;

    for (i=0; i < q->num_items ;i++) {
        printf("option: %s \n", q->items[i].I);
        printf("option: %s \n", q->items[i].name);
    }
    printf("Leaving Generate()\n");
}

//函數查詢

void query () {
    arg_t qHolder;
    arg_t *q = &qHolder;    // give the pointer an address
    q = malloc(sizeof(arg_t));

    generate (q);
    printf("There are %d of elements in the record.\n", qHolder.num_items); // <b> This line is wrong. It is giving 0 instead of 2. </b>
// There is no compiler error. It just does not print when it runs after the follwing line
    int i =0;

    for (i=0; i < q->num_items;i++) {
        printf("option: %s \n", qHolder.items[i].I);
        printf("option: %s \n", qHolder.items[i].name);
    }
    printf("Leaving Query()\n");
}

在main()中

    query ();

您在generate函數中犯了一個初學者錯誤。 您必須記住,在C語言中,所有參數都是按值傳遞的,這意味着它們的值將被復制到函數內部的局部變量中。 這意味着,當您在generate函數中分配給q時,僅分配本地副本。 您在調用generate函數時傳遞的參數將不會被修改。

此外,你需要檢查你的設計,因為在query您首先進行q&qHolder ,那么你覆蓋指針與調用malloc你調用malloc一次內部generate 因此,您只需將指針設置一次就可以設置三次。

而且我想知道如何編譯而不會讓編譯器大喊大叫,因為q 不是 object結構。

您的generate()函數采用一個object *q參數,但它要做的第一件事是通過將malloc()的結果賦值給它來覆蓋指針的值。 不必那樣做,因為調用方告訴您將object存儲在何處,所以無需分配新的內存。

這是固定版本:

void generate (object *q) {
    // initialize
    const object objectArray[] = {
        {
        .I = "1",
        .name = "John"
        }, // item 1
        {
        .I = "2",
        .name = "Jane"
        }, // item 2
    };

    q->num_items = sizeof objectArray / sizeof *objectArray;
    printf("There are %d of elements in the record.\n", q->num_items);
    memcpy(q->items, objectArray, sizeof objectArray);

    for (int i = 0; i < q->num_items; ++i) {
        printf("option: %s\n", q->items[i].I);
        printf("option: %s\n", q->items[i].name);
    }
    printf("Leaving generate()\n");
}

然后在query() ,通過調用malloc()再次覆蓋指針。 我認為您需要閱讀一些基礎知識。

這是固定版本:

void query (void) {
    arg_t qHolder;

    generate (&qHolder);
    printf("There are %d of elements in the record.\n", qHolder.num_items);
    for (int i = 0; i < q->num_items; ++i) {
        printf("option: %s \n", Holder.items[i].I);
        printf("option: %s \n", qHolder.items[i].name);
    }
    printf("Leaving query()\n");
}

暫無
暫無

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

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