我如何使用char **? (指向字符数组的指针)

时间:2019-04-12 21:13:24

标签: c arrays pointers char

因此,我正在尝试制作一个char**,我完全理解它在后台以及所有这些东西中的工作方式,但是我似乎并不了解如何编写该代码。我想创建一个指向具有名称的字符数组的指针。我需要在其中存储字符串(使用strcpy())并在此之后打印它的帮助。

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

3 个答案:

答案 0 :(得分:0)

如果您确实想要一个指向char数组的指针,则可以执行以下操作:

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

答案 1 :(得分:0)

您应该了解的第一件事是,将变量声明为单指针或双指针(或任何其他n指针)实际上并不能告诉底层变量是单个值还是值数组。

单指针指向存储实际值的存储地址。双指针指向存储单个指针的内存地址,依此类推。

现在,要创建一个指向char指针数组的指针,可以使用单个char指针(char*),但是出于可维护性的目的,我建议使用double char指针(char**)。

考虑以下代码:

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

它将为堆上的100个char指针(char*)分配内存空间,并向您返回该内存空间中第一个单指针(char**)的双指针(char*)。 。这意味着您将能够在该内存空间中保存100个char指针(或您的情况下的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;

另外,请注意,在将字符串保存到堆上时,需要为空字符再添加一个位置(手动)。

答案 2 :(得分:0)

  

所以我正在尝试制作一个char**,我完全理解它在   背景和所有这些东西,但我似乎不明白如何   为此编写代码。

嗯...不,不是。

要声明一个指针到字符,只需简单地进行除法:

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

为什么?调用malloc时,malloc分配一个提供strlen("MyName") + 1个字节的内存块,并将起始地址返回给该内存块-您已将其分配给name 。然后,您可以复制"MyName"来命名( nul-终止字符剩余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**会做什么?

在处理 pointer-to-pointer-to-char 时,必须首先分配一定数量的 pointers ,然后才能分配并分配一个每个指针的内存块,并像上面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"。如果您有任何问题,请告诉我。