【问题标题】:report Segmentation fault when loop the struct循环结构时报告分段错误
【发布时间】:2018-07-05 08:39:54
【问题描述】:
#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++;
    }
}

收到参数时会报'Segmentation fault'错误,我知道内存没有处理好,但是找不到问题。

我的输入是:

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

【问题讨论】:

    标签: c realloc


    【解决方案1】:

    问题似乎出在

    g = realloc(g, (g_len+1) * sizeof(struct group));
    

    其中,参数g 未初始化并指向一些无效的内存位置。

    引用C11,第 7.22.3.5 章

    如果ptr 是空指针,则realloc 函数的行为类似于malloc 函数 指定size。否则,如果ptr 与内存先前返回的指针不匹配 管理功能,或者如果空间已通过调用 freerealloc 函数,行为未定义。 [...]

    由于在您的情况下g 是一个自动局部变量,因此它是未初始化的并且包含不确定的值。为了使其正确,您需要将其初始化为NULL,类似于

    struct group *g = NULL;
    

    【讨论】:

      【解决方案2】:

      你需要:

      struct group *g = NULL;
      

      您将未初始化的指针传递给realloc(),这是未定义的行为。

      另请注意,如果总是有 2 个人,最好这样做:

      struct people peoples[2];
      

      在结构内部,减少堆分配并使事情变得更简单。

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

      【讨论】:

      • 谢谢,可以正常运行了。 peoples 是动态的,所以我使用结构指针。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-12
      • 2017-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多