【问题标题】:Why do I get a segfault when trying to access members of struct?为什么在尝试访问 struct 成员时会出现段错误?
【发布时间】:2021-09-02 01:21:09
【问题描述】:

每当我尝试打印存储在结构中的值时,都会遇到分段错误。使用 Valgrind,我能够将其缩小到一个代码块,但我不确定我做错了什么。我是否错误地初始化了我的结构?

每当我运行 valgrind 时,它都会告诉我有一个大小为 8 的 invalid write 我说 newList->data = d。

typedef struct List {
  struct List *np[Ends];        // next/prev neighbors
  Data data;
} *List;

typedef void *Data;

static void put(Data d) {
  List newList = malloc(sizeof(List));
  newList->data = d;
}

【问题讨论】:

    标签: c dll operating-system queue valgrind


    【解决方案1】:

    这是一个示例,说明为什么使用指针 typedef 是不好的做法。

    因为List 被定义为struct List * 的别名,所以sizeof(List) 为您提供指针的大小,而不是结构的大小。因此,您没有分配足够的内存。

    您需要malloc(sizeof(struct List)) 或(最好)malloc(sizeof *newlist)

    【讨论】:

    • 是的,如果你打算使用 typedef 指针,(例如,为了避免 ****someType,这根本不是一个坏习惯:),然后让它显而易见,例如 'pList' 或 'ListPtr '。
    猜你喜欢
    • 2014-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-03
    • 2022-01-22
    • 1970-01-01
    • 2020-12-12
    相关资源
    最近更新 更多