私は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 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
ファイルの内容:私は駅を作るとき、私は変わらずcontainer->numberOfStations
を残せば
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
、問題はありません。しかし、私は少なくともそれを一度増やして、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
私は1だけインクリメントするはずの乱暴にもかかわらず、私のnumberOfStationの変更を行うことどこかに小さな誤りがあるように感じますか?
最初の注意:mallocの戻り値をキャストしないでください。 2番目の注意:変数 'new'を呼び出すことはお勧めしません。 'name'はどこで宣言されていますか? 'strcpy(new-> name、name);' –
私のUni講義のノートにちょうど従っていました。 – Giedrius
'gdb'を使ってエラーを受け取っている入力と正確な行がありますか? – Jarvis