struct myStruct
{
int* arr;
int size;
};
void get_back(struct myStruct* my ,int* arr, int* size)
{
arr = my->arr;
*size = my->size;
}
int main()
{
struct myStruct my;
my.arr = (int*) malloc(3 * sizeof(int));
my.arr[0] = 20;
my.arr[1] = 200;
my.arr[2] = 2000;
my.size = 3;
int* ret_arr = NULL;
int size;
get_back(&my, ret_arr, &size);
free(my.arr);
return 1;
}
我的简单程序的目标是将my.arr中的值恢复到ret_arr,由于ret_arr = nullptr,我是否需要分配内存而不是将其复制到get_back函数内的数组中?登记/> 或者我可以指向“我的”结构中的现有数组?
这是我目前的解决方案,我复制了这些值。
struct myStruct
{
int* arr;
int size;
};
int* get_back(struct myStruct* my , int* size)
{
int *arr = (int*)malloc(3 * sizeof(int));
for (int i = 0; i < my->size; i++)
{
arr[i] = my->arr[i];
}
*size = my->size;
return arr;
}
int main()
{
myStruct my;
my.arr = (int*) malloc(3 * sizeof(int));
my.arr[0] = 20;
my.arr[1] = 200;
my.arr[2] = 2000;
my.size = 3;
int* ret_arr = NULL;
int size;
ret_arr = get_back(&my, &size);
free(my.arr);
free(ret_arr);
return 1;
}
答案 0 :(得分:2)
当您释放数组时,您可能希望使用memcpy
(来自string.h
)复制内容。
您还需要为stdlib.h
添加malloc
。
#include <string.h>
#include <stdlib.h>
// Struct definition goes here
void get_back(struct myStruct* my, int** arr, int* size)
{
*arr=malloc(my->size*sizeof(int)); //Allocate space for integers
memcpy(*arr, my->arr, my->size*sizeof(int)); //Copy integers to new array
*size=my->size;
}
该函数需要一个指向指针的指针才能修改它。
此外,您的main
功能也需要修改。
int main()
{
struct myStruct my; // Structs are not types.
my.arr = (int*) malloc(3 * sizeof(int));
my.arr[0] = 20;
my.arr[1] = 200;
my.arr[2] = 2000;
my.size = 3;
int* ret_arr = NULL;
int size;
get_back(&my, &ret_arr, &size); //Need to pass ret_arr by reference
free(my.arr);
return 1;
}
答案 1 :(得分:0)
使用std::vector
,它非常舒服且有许多有用的算法,有std::copy
功能可以从一个向量复制到另一个向量,在向量的帮助下查看您的任务:
#include <vector>
#include <iostream>
struct myStruct
{
std::vector<int> arr;
};
int main()
{
myStruct my;
my.arr.push_back(20);
my.arr.push_back(200);
my.arr.push_back(2000);
std::vector<int> ret_arr;
std::copy(my.arr.begin(), my.arr.end(), std::back_inserter(ret_arr));
return 1;
}
结果在屏幕上:
如果你想使用C语言,那么你应该在指针(int ** arr)上传递指针,以便在离开范围后正确指向。我将展示两种方法,首先只是指向已经分配的内存:
void get_back_pointers(myStruct* my ,int** arr, int* size)
{
*arr = my->arr;
*size = my->size;
}
其他用于深层复制,分配新数组并将数据复制到其中:
void get_back_copy(myStruct* my ,int** arr, int& size)
{
*arr = (int*) malloc(3 * sizeof(int));
memcpy( *arr, my->arr, my->size * sizeof(int) );
size = my->size;
}
在get_back_copy
传递arr
之后,需要释放其内存。在调试器中,您可以看到my.arr
和ret_arr
有一个地址但ret_arr2
有另一个地址的结果,因为它已在新内存中分配: