我试图修改一个结构,该结构是一个函数中另一个结构内部的指针,然后使更改反映回该函数外部。
我将下面的代码简化为我遇到的确切问题。我了解到,在当前构造的函数内部,我正在修改x的值,而不是利用x的地址进行修改,但是我似乎无法全神贯注于如何正确地修改每个{{1} }。我尝试过
particle
在b[0].p->x++;
函数中的for循环内,但这仅将test
从1更改为5。
p[0]
运行#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
会得到2、3、4和5,但是我仍然收到1、2、3和4。
答案 0 :(得分:2)
问题是您要为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;