передача значений из массива в структуру по ref - PullRequest
0 голосов
/ 03 мая 2018
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 голосов
/ 03 мая 2018

Поскольку вы освобождаете массив, вы, вероятно, хотите скопировать содержимое с помощью 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;
}
0 голосов
/ 03 мая 2018

Используйте 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

Если вы хотите использовать язык Си, вы должны передать указатель на указатель (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 имеет другой, потому что он выделен в новой памяти:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...