如何在 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
我有以下变量“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