![](/img/trans.png)
[英]How the memory is organized when I declare this array of chars pointer? "char* op[30]"
[英]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);
为什么? 当您调用malloc
, malloc
分配一块内存,提供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.