gpt4 book ai didi

c - 索引 'mallocced' 数组时出现段错误

转载 作者:太空狗 更新时间:2023-10-29 11:03:36 25 4
gpt4 key购买 nike

我已经为这个问题苦苦挣扎了几个小时,我对发生的事情一头雾水。这是 program.c 的代码:

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

#define SPACE 32
#define INITIAL 4

typedef struct {
char *town;
char *country;
} town_t;

typedef struct {
int num_towns, current_size;
town_t **towns_list;
} index_t;

int main(int argc, char *argv[]) {

index_t town_index;
town_index.current_size = INITIAL;
town_index.towns_list = malloc(town_index.current_size * sizeof(*(town_index.towns_list)));
assert(town_index.towns_list != NULL);

printf("Step: %d\n", 1);
town_index.towns_list[0]->town = malloc(4 * sizeof(*(town_index.towns_list[0]->town)));
printf("Step: %d\n", 2);
assert(town_index.towns_list[0]->town != NULL);

return 0;
}

在 Linux 上它是这样运行的:

./program
Step: 1
Segmentation fault

但在 Windows 上它会打印出来

program.exe
Step: 1
Step: 2

如我所料,这确实没有帮助。然而,对于 Linux 输出,很明显第一个打印语句正在执行而不是第二个,这会让我认为两者之间的界限是错误的。特别是,我认为执行 town_index.towns_list[0] 会给我带来问题,但我说不出原因。

这是一个相对复杂的数据结构,所以我可能在某些时候迷路了。基本上 town_index 是一个索引结构,包含 towns_listcurrent_size 中的当前城镇数量,它反射(reflect)了当前可用于保存城镇的空间.它还包含指向 town_t 的指针数组,其中包含作为字符串的名称和国家/地区。

我尝试过使用 Valgrind,但它确实帮不了什么忙。这是一个 Pastebin对于那些想看的人。

这是我在另一个程序中遇到的情况的简化场景,所以不要介意魔数(Magic Number)和诸如此类的东西。

这是在 VirtualBox Linux Mint 64 位上。


不相关的问题,如果有人可以:如何让 Valgrind 显示精确的线条?我在网上其他地方都看到了,但我的输出只是告诉我程序和函数所在的文件夹,这没有太大帮助。

最佳答案

您初始化了 town_index.towns_list,但没有初始化 town_index.towns_list[0],所以 town_index.towns_list[0]->town 是未定义的行为。

你错过了类似的东西

for (int i = 0; i < town_index.current_size; ++i)
town_index.towns_list[i] = malloc(sizeof **town_index.towns_list);

对于第二个维度。

关于c - 索引 'mallocced' 数组时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39976231/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com