【发布时间】:2019-05-07 09:08:26
【问题描述】:
我正在编写一个代码,该代码处理交叉路口的交通流量,并返回给定时间交叉路口的交通流量。
基本上我遇到的问题是一个结构数组,其中每个结构包含 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 的交点[] 的循环的计数器,而 h 和 v 是 coords[] 数组中包含的交点 i 的水平和垂直坐标)
如您所见,即使我什至没有使用递增函数访问该数组,某些交叉点的坐标也会在每个周期后修改
this->intersections[curr_int].timeslots[starting_t+travel_t]++;
这是导致此问题的原因。这怎么可能?会不会是内存分配问题?
【问题讨论】:
-
分配给
timeslots的内存在哪里? -
您的 malloc 调用几乎肯定是错误的。除了创建一个包含灵活数组成员的灵活数组成员,你不能稍微简化一下结构吗?
-
@P.W 在 malloc 的这一部分:
(sizeof(intersection)*(h_streets*v_streets)*(sizeof(int)*(max_time+1001)))基本上我为每个交叉点分配(sizeof(int)*(max_time+1001))(sizeof(intersection)*(h_streets*v_streets) -
灵活的数组成员不能解决这个问题。事实上,您已经编写了一个 malloc 调用,它变得如此复杂,以至于您自己甚至无法理解它。所以你的代码不可读或不简单。也许你真正想要的是一个查找表——一个指针数组,每个指针指向一个可变大小的数组。
-
您不能创建包含 FAM 的结构数组。 C11 Standard - 6.7.2.1 Structure and union specifiers(p3)
标签: c struct malloc flexible-array-member