所以我正在尝试制作char**,我完全理解它在
背景和所有这些东西,但我似乎不明白如何
为它写代码。
嗯...不,不完全是。
要声明一个 pointer-to-char,您只需 decalre:
char *name = malloc (strlen("MyName") + 1);
为什么?当您调用malloc 时,malloc 分配一个内存块,提供strlen("MyName") + 1 字节并将起始地址返回到该内存块——您分配给name。然后,您可以将"MyName" 复制到名称(nul-terminating 字符剩余 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"。如果您有任何问题,请告诉我。