簡體   English   中英

C-結構中的動態數組-重新分配后崩潰

[英]C - dynamic array in a struct - crash after reallocation

我是C語言的新手,試圖在結構中添加動態數組,我需要向其中添加動態數量的項。

如果在初始化容器時使用帶有較大數字(例如+100000)的malloc ,則該程序可以正常運行。

但是,如果我只是分配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在第一次增加后由於某種原因變得非常大。

我的完整代碼在: 鍵盤

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應該只增加一個,也可以使我的numberOfStation發生巨大變化?

在發布的原始版本中, container->numberOfStations未初始化。
在makeContainer中,您可能會考慮使用calloc()memset()將容器初始化為零-當您將新項目添加到結構中並且它們仍應初始化為零時,它可以很好地工作。

在當前版本中,我無法發現錯誤,也不能發現valgrind 我可以自由地在100個字符的限制內聲明name

好-看

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

所以stations是指針

所以makeContainer只是給它makeContainer了足夠的空間用於指針等。您甚至沒有為指針分配內存以具有信息或初始化numberOfStations 它只是一個未初始化的指針

PS:這可以編譯嗎

   strcpy(new->name, name);

找不到name聲明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM