C-重新分配后崩溃中的动态数组



我是C的新手,并尝试在结构内有一个动态数组,我需要添加动态数量的项目。

如果我将malloc与一个大数字(例如 100000)使用时,该程序可以正常工作。

但是,如果我只是分配sizeof(struct ...)内存,然后尝试使用realloc进行重新分配,则当我尝试将新项目添加到数组中时,程序会崩溃。即使我在重新定位时添加 1000000尺寸,它仍然会崩溃,而如果我在首先分配时使用相同的大小。

删除代码以显示我的问题:

struct Station {
    char name[100];
};
struct StationContainer {
    int numberOfStations;
    struct Station *stations[];
};
struct StationContainer *makeContainer() {
    struct StationContainer *new;
    // If I add +1000000 in size here, the program works fine
    new = (struct StationContainer *) malloc(sizeof(struct StationContainer));
    if (new == NULL) {
        fprintf(stderr, "makeContainer: out of memoryn");
        exit(1);
    }
    new->numberOfStations = 0;
    return new;
}
int main(int argc, int argv[]) {
    // Initialize the container
    struct StationContainer *container;
    container = makeContainer();
    // Add new station to container
    struct Station *new;
    new = (struct Station *) malloc(sizeof(struct Station));
    if (new == NULL) {
        fprintf(stderr, "makeStation: out of memoryn");
        exit(1);
    }
    strcpy(new->name, name);
    // Add to the container
    // Even if I add +1000000 here, it still crashes below when I add new item
    container = (struct StationContainer *) realloc(container, sizeof(struct StationContainer) + 1000000);
    if (container == NULL) {
        fprintf(stderr, "makeStation: container out of memoryn");
        exit(1);
    }
    container->stations[container->numberOfStations] = new;
    container->numberOfStations++;

}

edit1:但是,发现我的降低版本中的问题被发现,但是,一旦我返回完整版,我仍然会遇到错误。我得到了container out of memory。那是因为由于某种原因,我的container->numberOfStations在第一次增加后就非常大。

我的完整代码:codepad

adjacencies.txt文件内容:

Baker Street, Bond Street, Regent's Park
Bond Street, Marble Arch, Baker Street, Oxford Circus, Green Park
Marble Arch, Bond Street
Green Park, Bond Street, Oxford Circus, Piccadilly Circus
Regent's Park, Baker Street, Oxford Circus
Oxford Circus, Bond Street, Regent's Park, Warren Street, Tottenham Court Road, Piccadilly Circus
Piccadilly Circus, Green Park, Oxford Circus, Leicester Square, Charing Cross
Warren Street, Oxford Circus, Goodge Street
Goodge Street, Warren Street, Tottenham Court Road
Tottenham Court Road, Oxford Circus, Goodge Street, Holborn, Leicester Square
Leicester Square, Piccadilly Circus, Tottenham Court Road, Covent Garden, Charing Cross
Charing Cross, Piccadilly Circus, Leicester Square
Covent Garden, Leicester Square, Holborn
Holborn, Tottenham Court Road, Chancery Lane
Chancery Lane, Holborn

当我制作电台时,如果我离开container->numberOfStations不变,那就没问题了。但是,当我至少将其递增一次(结合realloc)时,它会变为巨大的数字。示例输出:

Number of stations: 0
!Station name:[Baker Street]
Number of stations: 1
!Station name:[Bond Street]
Number of stations: 4067560
makeStation: container out of memory

我觉得在某个地方有一个小错误,即使我的数字越来越多,即使它应该以一个来增加?

在发布的原始版本中, container->numberOfStations是未定式的。
在MakeContainer中,您可以考虑使用calloc()memset()将容器初始化为零 - 当您将新项目添加到结构时,它运行良好,并且仍应将其初始化为零。

在当前版本中,我没有发现任何错误,而valgrind也不能发现。我凭借在100个字符限制的约束中宣布name的自由。

好 - 看

struct StationContainer {
    int numberOfStations;
    struct Station *stations[];
};

所以stations是指针

因此,makeContainer只是为指针提供了足够的空间。您甚至没有为指针分配内存以获取信息或初始化的numberOfStations。这只是一个非初始化的指针

ps:是否编译

   strcpy(new->name, name);

找不到name

的声明

相关内容

  • 没有找到相关文章

最新更新