如何在 C 中复制指针数组? (uint32_t)

How can I duplicate an array of pointers in C? (uint32_t)

我有以下变量“places”,它是字符串位置动态数组的指针:

uint32_t* 个地方;

我希望我的函数 return 类型为 (uint32_t*)

的 DUPLICATE 指针

我目前的尝试:

uint32_t arrCpy = malloc((numberOfElements) * sizeof(uint32_t));
memcpy(arrCpy, places, sizeof(uint32_t*)*numberOfElements);
return arrCpy;

请解释我做错了什么以及如何解决这个问题?我在使用 gcc 时收到分段错误。

更正: 目标是取一个 uint32_t 并复制一个 uint32_t “请注意,函数 return 是重复的 键的位置数组,而不是指向存储在散列 table 中的原始数组的指针。这样做的理由是 return指向原始数组的指针是危险的,因为它允许用户直接修改原始数组 数组。

arrCpy 需要是一个(双)指针。如果是指针数组,还需要为num指针分配space,而不是值

// `places` should have type uint32_t **
uint32_t **arrCpy = malloc((numberOfElements) * sizeof(uint32_t*));
memcpy(arrCpy, places, sizeof(uint32_t*)*numberOfElements);
return arrCpy;

uint32_t* places; 不是指针数组,它是指向 uint32_t 的指针,一个数字。通常,要有一个 something 的数组,您应该有一个指向 something 的指针。所以你可能想像 uint32_t** places; 一样声明你的 places,arrCpy 也是如此。

uint32_t** dup(uint32_t** places, int numberOfElements)
{
    uint32_t **arrCpy = malloc((numberOfElements) * sizeof(uint32_t*));
    memcpy(arrCpy, places, sizeof(uint32_t*)*numberOfElements);
    return arrCpy;
}

---已编辑---

如果你想复制一个uint32_t的数组:

uint32_t* dup(uint32_t* places, int numberOfElements)
{
    uint32_t *arrCpy = malloc((numberOfElements) * sizeof(uint32_t));
    memcpy(arrCpy, places, sizeof(uint32_t)*numberOfElements);
    return arrCpy;
}

你可以看到无论你想复制什么数组,你创建一个指针,分配它的内存然后复制它,然后return那个指针。

---已编辑---

一个完整的代码

#include <string.h>
#include <stdlib.h>
#include <stdio.h>
int* dup(int* places, int n)
{
    int *arrCpy = malloc((n) * sizeof(int));
    memcpy(arrCpy, places, sizeof(int)*n);
    return arrCpy;
}

void main()
{
    int a[3] = {1,2,3};
    int i;

    for(i=0; i<3; i++)
    {
        printf("%u, ", a[i]);
    }
    printf("\n");
    // print 1,2,3

    int *b = dup(a, 3);
    a[0]=100;
    for(i=0; i<3; i++)
    {
        printf("%u, ", a[i]);
    }
    printf("\n");
    // print 100,2,3
    for(i=0; i<3; i++)
    {
        printf("%u, ", b[i]);
    }
    printf("\n");
    //print 1,2,3
}
uint32_t* places;

I would like for my function to return a DUPLICATE (not the same) pointer which points to the same array of strings.

如果你写的正是你需要的,它只是一个指向同一个数组的指针。但它不是一个字符串数组,它是一个指向 32 位 int

的指针数组
  • 如果需要传递一个指向已有指针数组的指针,只需要这样写
    uint32_t*     to_the_same_places = places;

places 有指针数组的起始地址,所以你只需要复制 places.

  • 如果你需要复制指针数组,但指向相同的地方,你在每个程序开始时都会遇到类似的情况:你需要知道有多少指针在places .这就是 main() 被声明为
  • 的原因
int    main(int argc, char** argv);

argc正好和指针的数量一致,所以系统可以构建数组,你可以迭代它们。

如果您知道大小并需要复制所有内容

这是常见的情况,因为 places 地址的来源可能超出范围并使 places 指向的整个块无效。由于新数组将指向相同的位置,因此您需要分两步进行:

  • 你需要分配一个区域来存放所有的指针。大小是指针的数量乘以您机器中指针的大小。指针在内存中对齐,因此您可以使用 memcpy()

    一次复制整个块
  • 您需要创建一个指向新数组的指针。无需使用 uint32_t**

您可以逆向执行这些步骤。

但是你需要知道有多少个指针places指向,并且可能更实用只是按照系统的方式写一对像int argc, char** argv