通过ref从struct中的数组传回值

时间:2018-05-03 19:15:23

标签: c arrays pointers

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;
}

2 个答案:

答案 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;
}

结果在屏幕上:

enter image description here

如果你想使用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.arrret_arr有一个地址但ret_arr2有另一个地址的结果,因为它已在新内存中分配:

enter image description here