微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在C中复制一个指针数组? uint32_t 如果您知道大小并且需要复制所有内容

如何解决如何在C中复制一个指针数组? uint32_t 如果您知道大小并且需要复制所有内容

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

uint32_t *个地方;

我希望函数返回类型为(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 “请注意,该函数返回一个重复项 键的位置数组的值,而不是散列表中存储的原始数组的指针。这样做的理由是 返回指向原始数组的指针将很危险,因为它将允许用户直接修改原始数组 数组。”

解决方法

uint32_t* places;不是指针数组,它是指向uint32_t(数字)的指针。通常,要具有something数组,您应该有一个指向something的指针。因此,您可能想像places一样声明uint32_t** 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,sizeof(uint32_t)*numberOfElements);
    return arrCpy;
}

无论您要复制哪个数组,您都可以看到,创建了一个指针,分配了它的内存,然后将其复制,然后返回该指针。

---编辑---

完整的代码

#include <string.h>
#include <stdlib.h>
#include <stdio.h>
int* dup(int* places,int n)
{
    int *arrCpy = malloc((n) * sizeof(int));
    memcpy(arrCpy,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,3

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

我想让我的函数返回DUPLICATE(不一样) 指向相同字符串数组的指针。

如果您确实编写了所需的内容,则它只是指向同一数组的指针。但这不是字符串数组,而是指向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之类的对

,

arrCpy必须是(双)指针。如果它是一个指针数组,则还需要为num pointers (而不是值)分配空间。

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。