如何复制char指针数组的值?

时间:2018-10-16 02:17:02

标签: c arrays pointers

如何将char指针数组中的值复制到另一个数组中?我真的迷路了,请帮帮我。这就是我到目前为止所拥有的。

char **copy_values(char **values) {
    char **val;

    //do something 
    return val;
}

2 个答案:

答案 0 :(得分:1)

要完全复制指针和值(它们指向的),您需要了解三件事:

  1. 我有多少个指针?
  2. 我还需要复制他们指向的内容吗?如果可以的话
  3. 我有多少个指针指向我需要复制的内容。

当您声明一个指向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 */
}

您现在可以使用MAXPTRS32)个指针。如果您随后为其中的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分配的内存