Как изменить указатель на массив структур внутри другой структуры по ссылке - PullRequest
0 голосов
/ 18 апреля 2019

Я пытаюсь изменить структуру, которая является указателем внутри другой структуры внутри функции, а затем отразить изменение обратно за пределами функции.

Я упростил мой код, приведенный ниже, именно к той проблеме, с которой я столкнулся. Я понимаю, что внутри моей функции, как она построена в настоящее время, я изменяю значение x, а не использую адрес x для изменения, но я не могу понять, как правильно изменять каждый particle в массив. Я пытался

b[0].p->x++;

внутри цикла for в функции test, но это только меняет p[0] с 1 на 5.

#include <stdio.h>
#include <stdlib.h>

typedef struct {
        int x;
} particle_t;

typedef struct {
        int num_part;
        particle_t* p;
} bins;

void test (bins *b) {
        for (int i = 0; i < 4; i++) {
                b[0].p[i].x++;
        }
}

int main (int argc, char **argv) {
        particle_t *particles = (particle_t*) malloc (4 * sizeof(particle_t));
        particles[0].x = 1;
        particles[1].x = 2;
        particles[2].x = 3;
        particles[3].x = 4;

        bins *b = (bins*) malloc (4 * sizeof(bins));
        b[0].num_part = 1;
        b[0].p = (particle_t*) malloc (4 * sizeof(particle_t));

        for (int i = 0; i < 4; i++) {
                b[0].p[i] = particles[i];
        }

        test(b);

        printf("%d %d %d %d\n",particles[0].x,particles[1].x,particles[2].x,particles[3].x);

        return 0;
}

После запуска функции test я ожидал, что распечатка particles[i].x даст 2, 3, 4 и 5, но я все еще получаю 1, 2, 3 и 4.

1 Ответ

2 голосов
/ 18 апреля 2019

Проблема в том, что вы выделяете новый массив для b [0] .p и копируете массив частиц в массив b [0] .p. Ваша функция изменяет память в b [0] .p, а не память, указанную частицами.

Вместо malloc просто сделайте ваш массив b [0] .p указателем на частицы.

Подведение итогов, изменение

b[0].p = (particle_t*) malloc (4 * sizeof(particle_t));

до

b[0].p = particles;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...