我正在研究一个代码,它随着时间的推移处理十字路口的交通并返回给定时间十字路口的交通量。
基本上我遇到的问题是一个结构数组,其中每个结构包含 2 个向量:一个具有交叉口的坐标 (x, y),另一个跟踪在时间 t 进入该交叉口的汽车数量(每个插槽从 0 到n代表时间,里面的值是当时通过的汽车数量)。
这是结构:
typedef struct intersection {
int coords[2];
int timeslots[];
} intersection;
它包含在此结构的交集数组中:
typedef struct simulation {
int h_streets; //row (horizontal streets)
int v_streets; //column (vertical streets)
int n_cars; //cars number
int n_trips; //trips number
car car_pos [1000];
intersection intersections [];
} simulation;
然后使用 malloc 分配内存,以在读取所需数据时定义灵活数组的实际数组大小:
struct simulation * this = malloc( sizeof(simulation) + (sizeof(intersection)*(h_streets*v_streets)*(sizeof(int)*(max_time+1001))) );
在读取有关汽车从一个位置到另一个位置的行程的数据时,如前所述,我所做的是,当汽车当时穿过那个十字路口时,将 timeslots[t] 增加一。
问题是,当我使用包含在 while 循环中的这行代码这样做时
this->intersections[curr_int].timeslots[starting_t+travel_t]++;
坐标数组中的值被修改。
这是一个在每个循环中仅打印出交叉点坐标的示例:
------------------
i: 0, h: 0, v: 0
i: 1, h: 0, v: 1
i: 2, h: 0, v: 2
i: 3, h: 0, v: 3
i: 4, h: 1, v: 0
i: 5, h: 1, v: 1
i: 6, h: 1, v: 2
i: 7, h: 1, v: 3
i: 8, h: 2, v: 0
i: 9, h: 2, v: 1
i: 10, h: 2, v: 2
i: 11, h: 2, v: 3
i: 12, h: 3, v: 0
i: 13, h: 3, v: 1
i: 14, h: 3, v: 2
i: 15, h: 3, v: 3
------------------
------------------
i: 0, h: 0, v: 0
i: 1, h: 1, v: 1
i: 2, h: 0, v: 2
i: 3, h: 0, v: 3
i: 4, h: 1, v: 0
i: 5, h: 1, v: 1
i: 6, h: 1, v: 2
i: 7, h: 1, v: 3
i: 8, h: 2, v: 0
i: 9, h: 2, v: 1
i: 10, h: 2, v: 2
i: 11, h: 2, v: 3
i: 12, h: 3, v: 0
i: 13, h: 3, v: 1
i: 14, h: 3, v: 2
i: 15, h: 3, v: 3
------------------
------------------
i: 0, h: 0, v: 0
i: 1, h: 1, v: 2
i: 2, h: 0, v: 2
i: 3, h: 0, v: 3
i: 4, h: 1, v: 0
i: 5, h: 1, v: 1
i: 6, h: 1, v: 2
i: 7, h: 1, v: 3
i: 8, h: 2, v: 0
i: 9, h: 2, v: 1
i: 10, h: 2, v: 2
i: 11, h: 2, v: 3
i: 12, h: 3, v: 0
i: 13, h: 3, v: 1
i: 14, h: 3, v: 2
i: 15, h: 3, v: 3
------------------
------------------
i: 0, h: 0, v: 0
i: 1, h: 1, v: 2
i: 2, h: 0, v: 2
i: 3, h: 0, v: 3
i: 4, h: 2, v: 0
i: 5, h: 1, v: 1
i: 6, h: 1, v: 2
i: 7, h: 1, v: 3
i: 8, h: 2, v: 0
i: 9, h: 2, v: 1
i: 10, h: 2, v: 2
i: 11, h: 2, v: 3
i: 12, h: 3, v: 0
i: 13, h: 3, v: 1
i: 14, h: 3, v: 2
i: 15, h: 3, v: 3
------------------
[...]
(i 是访问位置 i 中的 intersections[] 的循环的计数器,而 h 和 v 是 coords[] 数组中包含的交叉点 i 的水平和垂直坐标)
正如您所注意到的,即使我什至没有使用递增函数访问该数组,某些交叉点的坐标也会在每个周期后进行修改
this->intersections[curr_int].timeslots[starting_t+travel_t]++;
这是导致此问题的原因。这怎么可能?会不会是内存分配问题?