因此,我正在尝试制作一个char**
,我完全理解它在后台以及所有这些东西中的工作方式,但是我似乎并不了解如何编写该代码。我想创建一个指向具有名称的字符数组的指针。我需要在其中存储字符串(使用strcpy())并在此之后打印它的帮助。
char** name = (char**)malloc((strlen("MyName") + 1) * sizeof(char*));
strcpy(name, "MyName"); // I get an error right here
答案 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"
。如果您有任何问题,请告诉我。