繁体   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