2014-02-13 85 views
-1

我在函數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"); 
} 
在主

()

query(); 
+0

我猜你是問有關你得到了編譯器錯誤?將來,請始終提供完整的和未經編輯的錯誤日誌與問題,因爲這有助於我們回答實際問題而不是無關的事情。 –

+0

沒有編譯器錯誤。它只是不打印,當它在行後面運行時: //以下將不起作用 – Babbit

+0

您*應該*得到編譯器錯誤,因爲當函數需要一個指針時,首先調用'generate'指針指向'arg_t'到'對象'。那麼你應該在'generate'內部得到錯誤,因爲'q'是一個指向'object'的指針,並且沒有諸如'items'或'num_items'的成員。 –

回答

1

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"); 
} 
+0

它仍然沒有返回值。 – Babbit

1

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

此外,你需要檢查你的設計,因爲在query你先q&qHolder,那麼你覆蓋指針與您的來電malloc你再打電話mallocgenerate。所以你設置指針三次,只有其中一個就足夠了。

我不知道如何編譯沒有編譯器大喊大叫,因爲q不是object結構。

+0

@Babbit請參閱我的編輯。 –

+1

@Babbit簡單地刪除'malloc'調用,它們覆蓋原來的指針並給你內存泄漏。 –

+0

在我必須從1個內存區域傳遞到下一個的情況下,我不需要malloc嗎?說,這些通話功能在2個設備上。 – Babbit