#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct group {
int no;
int people_len;
struct people *peoples;
int weight;
};
struct people {
char name[4];
int weight;
};
int main() {
int n,k;
if (scanf("%d %d", &n, &k) < 2) return 0;
struct group *g;
char from[4], to[4];
int f1 = -1, f2 = -1, time, g_len = 0, p_len = 0;
for (int i=0;i<n;i++) {
if (scanf("%s %s %d", from, to, &time) < 3) return 0;
g = realloc(g, (g_len+1) * sizeof(struct group));
g[g_len].no = g_len;
g[g_len].people_len = 2;
g[g_len].peoples = malloc(2 * sizeof(struct people));
strcpy(g[g_len].peoples[0].name, from);
strcpy(g[g_len].peoples[1].name, to);
g[g_len].weight = time;
g_len++;
}
}
当我收到参数时,它将报告“分段错误”错误,我知道内存处理不当,但是我找不到问题。
输入是:
8 59
AAA BBB 10
BBB AAA 20
AAA CCC 40
DDD EEE 5
EEE DDD 70
FFF GGG 30
GGG HHH 20
HHH FFF 10
答案 0 :(得分:2)
问题似乎出在
g = realloc(g, (g_len+1) * sizeof(struct group));
其中,参数g
未初始化,并指向某个无效的内存位置。
引用C11
,第7.22.3.5章
如果
ptr
为空指针,则realloc
函数的行为类似于malloc
函数的行为。 指定的size
。否则,如果ptr
与先前由内存返回的指针不匹配 管理功能,或者通过调用free
释放了空间,或者realloc
函数,其行为未定义。 [...]
因为在您的情况下,g
是一个自动局部变量,所以将其进行了单位化并且包含不确定的值。为了使其正确,您需要将其初始化为NULL
,例如
struct group *g = NULL;
答案 1 :(得分:2)
您需要:
struct group *g = NULL;
您正在将未初始化的指针传递给realloc()
,这是未定义的行为。
还请注意,如果总是要有2个人,那么最好这样做:
struct people peoples[2];
在结构内部,以减少堆分配并简化操作。
惯例/标准是一次不重新分配一个元素,而是通过将每个新分配需求的大小加倍,或者最后通过添加更多数量的元素,使它成指数增长。这是因为堆分配很昂贵(需要花费时间),所以如果可能的话,减少分配对性能很有好处。当然,这需要与分配的长度分开跟踪数组的实际使用/有效。