我有以下变量"places“,它是字符串位置的动态数组的ptr:
uint32_t*场所;
我希望我的函数返回一个重复的类型指针(uint32_t*)
我目前的尝试是:
uint32_t arrCpy = malloc((numberOfElements) * sizeof(uint32_t));
memcpy(arrCpy, places, sizeof(uint32_t*)*numberOfElements);
return arrCpy;请解释我做错了什么,以及如何解决这个问题?我收到了一个分割错误使用gcc。
更正:目标是获取一个uint32_t并创建一个重复的uint32_t“注意该函数返回键的位置数组的副本,而不是存储在哈希表中的原始数组的指针。原因是返回指向原始数组的指针将是危险的,因为它允许用户直接修改原始数组。”
发布于 2020-11-10 02:54:47
uint32_t* places;,我希望函数返回一个指向相同字符串数组的重复指针(而不是相同的指针)。
如果您准确地编写了所需的内容,则它只是指向同一个数组的指针。但它不是字符串数组,而是指向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的指针。
发布于 2020-11-10 02:24:37
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, places, 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, 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
}发布于 2020-11-10 02:21:28
arrCpy需要是一个(双)指针。如果它是一个指针数组,则还需要为num指针分配空间,而不是为值分配空间。
// `places` should have type uint32_t **
uint32_t **arrCpy = malloc((numberOfElements) * sizeof(uint32_t*));
memcpy(arrCpy, places, sizeof(uint32_t*)*numberOfElements);
return arrCpy;https://stackoverflow.com/questions/64761912
复制相似问题