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

时间:2017-02-15 16:48:03

标签: c struct malloc realloc

我是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 memory\n");
        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 memory\n");
        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 memory\n");
        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

我觉得某个地方有一个小错误会让我的numberOfStation变得疯狂,即使它应该只增加一个?

2 个答案:

答案 0 :(得分:4)

在发布的原始版本中,container->numberOfStations未初始化 在makeContainer中,您可以考虑使用calloc()memset()将容器初始化为零 - 当您向结构中添加新项目时,它可以很好地工作,并且它们仍应初始化为零。

在当前版本中,我发现没有错误,valgrind也没有。我冒昧地在100字符限制的约束下声明name

答案 1 :(得分:2)

好吧 - 看看

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

所以stations是指针

所以makeContainer只是为指针等提供了足够的空间。你甚至没有为指针分配内存来获取信息,也没有初始化numberOfStations。它只是一个未初始化的指针

PS:这是否编译

   strcpy(new->name, name);

找不到name

的声明