循环结构时报告分段错误

时间:2018-07-05 08:39:55

标签: c realloc

#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

2 个答案:

答案 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];

在结构内部,以减少堆分配并简化操作。

惯例/标准是一次不重新分配一个元素,而是通过将每个新分配需求的大小加倍,或者最后通过添加更多数量的元素,使它成指数增长。这是因为堆分配很昂贵(需要花费时间),所以如果可能的话,减少分配对性能很有好处。当然,这需要与分配的长度分开跟踪数组的实际使用/有效。