簡體   English   中英

通過傳遞給函數的指針修改結構數組

[英]Modifying a structure array through a pointer passed to a function

我試圖將一個結構數組指針和一個指向結構數組指針的指針傳遞給一個函數,然后對其進行修改,而不是使用返回值。

這個示例代碼確實毫無意義,對我來說只是一個學習示例。

基本上,我想創建array [0] ... array [1] .. array [2]等,並在使用不同的索引時有一個指向這些的指針...例如array_ref [2]指向array [0]和array_ref [3]指向array [1]。

下面的代碼可以編譯,但立即崩潰。 有什么建議么?

typedef struct unit_class_struct {
    char *name;
    char *last_name;
} person;




int setName(person * array, person ***array_ref) {
   array[0].name = strdup("Bob");
   array[1].name = strdup("Joseph");
   array[0].last_name = strdup("Robert");
   array[1].last_name = strdup("Clark");

*array_ref[2] = &array[0];
*array_ref[3] = &array[1];

    return 1;
}



int main()
{
    person *array;
    person **array_r;

   array = calloc (5, sizeof(person));
   array_r = calloc (5, sizeof(person));

   setName(array,&array_r);

    printf("First name is %s %s\n", array_r[2]->name, array_r[2]->last_name);
    printf("Second name is %s %s\n", array_r[3]->name, array_r[3]->last_name);

    return 0;
}

您正在分配結構數組,但聲明了一個指針數組。

Calloc()和malloc()返回一個可以分配給所有對象的void *對象。 因此,即使使用-Wall您的程序也將在沒有警告的情況下進行編譯。

但是,當它運行時,它會嘗試處理您所說的指針數組,實際上是指向指針的指針數組。 這些指針均未創建。 您所開始的只是指向對象數組的一級指針。 根據您的實際需求,您可能需要更多類似...

    array_ref[2] = &array[0];
    array_ref[3] = &array[1];

    return 1;
}


int main()
{
    person *array, *array_r_real;
    person **array_r;

    array = calloc(5, sizeof(person));
    array_r_real = calloc(5, sizeof(person));
    array_r = calloc(5, sizeof(struct unit_class_struct *));
    int i;
    for (i = 0; i < 5; ++i)
        array_r[i] = &array_r_real[i];

    setName(array, array_r);

暫無
暫無

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

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