首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在C中复制指针数组?(uint32_t)

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

Stack Overflow用户
提问于 2020-11-10 02:15:31
回答 3查看 218关注 0票数 0

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

uint32_t*场所;

我希望我的函数返回一个重复的类型指针(uint32_t*)

我目前的尝试是:

代码语言:javascript
运行
复制
uint32_t arrCpy = malloc((numberOfElements) * sizeof(uint32_t));
memcpy(arrCpy, places, sizeof(uint32_t*)*numberOfElements);
return arrCpy;

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

更正:目标是获取一个uint32_t并创建一个重复的uint32_t“注意该函数返回键的位置数组的副本,而不是存储在哈希表中的原始数组的指针。原因是返回指向原始数组的指针将是危险的,因为它允许用户直接修改原始数组。”

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-11-10 02:54:47

代码语言:javascript
运行
复制
uint32_t* places;

,我希望函数返回一个指向相同字符串数组的重复指针(而不是相同的指针)。

如果您准确地编写了所需的内容,则它只是指向同一个数组的指针。但它不是字符串数组,而是指向32位int的指针数组。

  • 如果需要传递指向现有指针数组的指针,则只需编写

代码语言:javascript
运行
复制
    uint32_t*     to_the_same_places = places;

places有指针数组开始的地址,所以您只需要复制places

  • 如果需要复制指针数组,但指向相同的位置,则在每个程序开始时处于类似的情况:您需要知道places中有多少指针。这就是为什么宣布main()

的原因。

代码语言:javascript
运行
复制
int    main(int argc, char** argv);

argc及时提供了指针的数量,因此系统可以构建数组,您可以迭代它们。

如果你知道大小,需要复制所有的东西

这是常见的场景,因为places地址的来源可能超出范围并使places所指向的完整块失效。由于新数组将指向相同的位置,您需要分两个步骤:

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

一次复制整个块。

  • ,您需要创建指向新数组的指针。不需要使用uint32_t**

你可以倒转台阶。

但是您需要知道places指向了多少指针,而且可能更实用,只需按系统的方式编写一个类似于int argc, char** argv的指针。

票数 1
EN

Stack Overflow用户

发布于 2020-11-10 02:24:37

uint32_t* places;不是一个指针数组,它是一个指向uint32_t的指针,一个数字。通常,要有一个something数组,就应该有一个指向something的指针。因此,您可能希望将您的places声明为uint32_t** places;,arrCpy也是如此。

代码语言:javascript
运行
复制
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数组

代码语言:javascript
运行
复制
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;
}

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

-编辑--

完整的代码

代码语言:javascript
运行
复制
#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
}
票数 1
EN

Stack Overflow用户

发布于 2020-11-10 02:21:28

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

代码语言:javascript
运行
复制
// `places` should have type uint32_t **
uint32_t **arrCpy = malloc((numberOfElements) * sizeof(uint32_t*));
memcpy(arrCpy, places, sizeof(uint32_t*)*numberOfElements);
return arrCpy;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64761912

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档