如何将char指针数组中的值复制到另一个数组中?我真的迷路了,请帮帮我。这就是我到目前为止所拥有的。
char **copy_values(char **values) {
char **val;
//do something
return val;
}
答案 0 :(得分:1)
要完全复制指针和值(它们指向的),您需要了解三件事:
当您声明一个指向char的指针的指针时,它只是一个未初始化的指针。为了提供寻址多个地址的能力,然后分配一些所需数量的指针(例如MAXPTRS
)。例如:
#define MAXPTRS 32
...
char **values = NULL;
values = malloc (MAXPTRS * sizeof *values); /* allocate MAXPTRS pointers */
if (values == NULL) { /* validate/handle error */
perror ("malloc-values");
/* handle error */
}
您现在可以使用MAXPTRS
(32
)个指针。如果您随后为其中的8
个分配存储空间,例如
size_t count = 0;
while (fgets (buf, sizeof buf, stdin)) {
size_t len = strlen (buf);
values[count] = malloc (len + 1);
if (!values[count]) {
perror ("malloc-values[count]");
break;
}
memcpy (values[count++], buf, len + 1);
}
因此,在示例中,到此为止,您已分配了32
个指针,而这些指针中的8
指向保存从stdin
读取的字符串的内存块。
如果您随后要复制整个结构,则不仅必须复制原始的32
指针,而且还必须复制初始化指针指向的8
内存块。如果您无法复制指向的内存块并仅分配指针(例如val[i] = values[i]
),则对原始内容的任何更改(例如values[2]
将自动反映在val[2]
中(这可能是您想要的,也可能不是)
要完全复制指向char的指针的values
指针,并返回包含相同数量的指针的val
,并分配并包含原始values
指针数组中每个字符串的副本,则需要“深度复制”,不仅要复制指针,还要复制内容,例如
char **copystrings (const char **values, size_t nptrs, size_t filled)
{
char **val = NULL;
val = malloc (nptrs * sizeof *val); /* allocate nptrs pointers */
if (!val) { /* validate */
perror ("malloc-val");
return NULL;
}
for (size_t i = 0; i < filled; i++) { /* loop over each filled ptr */
size_t len = strlen (values[i]); /* get length of string */
val[i] = malloc (len + 1) /* allocate storare val[i] */
if (!val[i]) { /* validate */
perror ("malloc-val[i]");
break;
}
memcpy (val[i], values[i], len + 1); /* copy to val[i] */
}
return val; /* return val (may contain less than filled allocated) */
}
(注意:),如果未编译,建议将filled
用作指针,并使用filled
的值更新i
,然后再返回提供一种方法来验证filled
指针的所有内存块都是重复的,否则malloc
的{{1}}失败将导致分配和复制的val[i]
少于无法告诉您-除非您在分配filled
时使用calloc
将新内存归零)
深层复制使您可以修改复制的值,而无需更改val
中指针所指向的地址处的数据。如果您不修改数据(例如,您只想用values
对指针进行排序,那么就不需要“深度复制”,而只需要分配qsort
个指针即可,将地址从filled
分配到values
。
了解您的需求和实现目标的差异是关键。
(感谢@4386427忽略了一些遗漏)
答案 1 :(得分:0)
如何将char指针数组中的值复制到另一个数组中?
类似的东西:
char **copy_values(char **values, int size) {
char **val = malloc(size * sizeof *val);
if (val) memcpy(val, values, size * sizeof *val);
return val;
}
完成后,请记住free
分配的内存