簡體   English   中英

我如何使用 char** ? (指向字符數組的指針)

[英]How do I use char** ? (pointer to an array of chars)

所以我正在嘗試制作一個char** ,我完全理解它在后台是如何工作的以及所有這些東西,但我似乎不明白如何為它編寫代碼。 我想創建一個指向其中有名稱的字符數組的指針。 我需要幫助在其中存儲字符串(使用 strcpy() )並在此之后打印它。

char** name = (char**)malloc((strlen("MyName") + 1) * sizeof(char*));
strcpy(name, "MyName"); // I get an error right here

如果你真的想要一個指向 char 數組的指針,你可以執行以下操作:

char** name = (char**)malloc(sizeof(char*)); //initialize the pointer
*name = (char*)malloc((strlen("MyName") + 1) * sizeof(char)); //initialize the array
strcpy(*name, "MyName");

您應該理解的第一件事是,將變量聲明為單指針或雙指針(或任何其他 n 指針)實際上並不能說明底層變量是保存單個值還是值數組。

單個指針指向存儲實際值的內存地址。 雙指針指向存儲單指針的內存地址,依此類推。

現在,要創建指向 char 指針數組的指針,您可以使用單個 char 指針 ( char* ),但出於可維護性目的,我建議使用雙 char 指針 ( char** )。

考慮以下代碼:

char** names = (char**)malloc(100 * sizeof(char*));

它將為堆上的 100 個字符指針 ( char* ) 分配內存空間,並返回一個雙指針 ( char** ) 到該內存空間中的第一個單指針 ( char* )。 這意味着您將能夠在該內存空間中保存 100 個字符指針(或在您的情況下為 100 個名稱)。 然后你可以像這樣使用它們:

char* name0 = "First Name"; // Saved on stack
char* name1 = malloc((strlen("Second Name") + 1) * sizeof(char));  // Saved on heap
strcpy(name1, "Second Name");

names[0] = name0;
names[1] = name1;

另外,請注意,在堆上保存字符串時,您需要為空字符再添加一個位置(手動)。

所以我正在嘗試制作一個char** ,我完全理解它在后台是如何工作的以及所有這些東西,但我似乎不明白如何為它編寫代碼。

嗯……不,不完全是。

要聲明一個指向 char指針,您只需 decalre:

    char *name = malloc (strlen("MyName") + 1);

為什么? 當您調用mallocmalloc分配一塊內存,提供strlen("MyName") + 1個字節,並將起始地址返回到該內存塊 - 您分配給name 然后,您可以將"MyName"復制到 name(空終止字符剩余 1 個字節)。 方法是:

    size_t len = strlen ("MyName");
    char *name = malloc (len + 1);      /* allocate len + 1 bytes */
    if (name == NULL) {                 /* validate EVERY allocation */
        perror ("malloc-name");
        /* handle error by returning or exiting */
    }
    memcpy (name, "MyName", len + 1);   /* no need to scan again for \0 */

    /* do something with name - here */

    free (name);    /* don't forget to free name when you are done */

那么char**做什么呢?

當您處理指向字符的指針時,您必須首先分配一定數量的指針,然后您可以為每個指針分配和分配一塊內存,並像以前一樣使用每個指針上面的name

例如:

    /* array of ponters to string-literals for your source of strings */
    char *band[] = { "George", "Ringo", "Paul", "John" };
    char **names;
    size_t nmembers = sizeof band / sizeof *band;

    /* allocate nmembers pointers */
    names = malloc (nmembers * sizeof *names);
    if (names == NULL) {                /* validate EVERY allocation */
        perror ("malloc-name_pointers");
        /* handle error by returning or exiting */
    }

    /* now loop allocating for each name and copy */
    for (size_t i = 0; i < nmembers; i++) {
        size_t len = strlen (band[i]);      /* get length */
        names[i] = malloc (len + 1);        /* allocate */
        if (names[i] == NULL) {             /* validate EVERY allocation */
            perror ("malloc-names[i]");
            /* handle error by returning or exiting */
        }
        memcpy (names[i], band[i], len + 1);/* no need to scan again for \0 */
    }

    /* output each */
    for (size_t i = 0; i < nmembers; i++)
        printf ("member[%zu]: %s\n", i + 1, names[i]);

釋放names是一個兩步過程。 您必須釋放分配給每個names指針的內存,然后釋放指針本身,例如

    for (size_t i = 0; i < nmembers; i++)
        free (names[i]);    /* free each allocated names[i] */
    free (names);           /* free pointers */

現在希望你更密切地"... fully understand how it works" 如果您有任何問題,請告訴我。

暫無
暫無

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

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