-1

malloc最初に配列にスペースを割り当ててから、realloc配列を拡張しようとしています。プログラムはコンパイルされますが、プログラムを実行すると端末に奇妙なメモリ プリントが表示されます。端末は次のようなことを言います:======== Memory map =========そして、たくさんの数字やもの。

私のプログラムでは、malloc を次のように使用します。

struct station *addStation(struct station *graph, struct station newStation){
    graph = realloc(graph, sizeof(graph)+sizeof(struct station));
// Count the rows of graph[] here and add newStation to the end.
}

int main(){
    struct station *graph;
    graph = malloc(145*sizeof(struct station));
    graph = loadStations();
    newStation = graph[27];

    graph = addStation(graph, newStation);
}

私はそれを間違って使用していますか?

4

6 に答える 6

4

メモリがあるポインタを上書きしています:

graph = malloc(145*sizeof(struct station));
graph = loadStations(); // malloc'd memory is lost here

メモリにデータを追加したい場合は、代わりにポインターとして渡す必要があります。

loadStations(graph);

また、sizeof(graph)+sizeof(struct station)データを 1 つのポインタと 1 つのステーションにのみ予約しますが、これは必要なものではありません。既存のサイズ情報を渡す必要があります。

struct station * addStation(struct station * graph, size_t * count, struct station newStation){
    size_t newCount = *count + 1;
    graph = realloc(graph, newCount * sizeof(struct station));
    if(!graph)
        return 0;
    *count = newCount;
    // Copy new station here
    return graph;
}

メインで呼び出します:

    temp = addStation(graph, &graphCount, newStation);
    if(temp)
        graph = temp;
于 2013-09-26T08:05:38.973 に答える
3

sizeof(graph)たとえば、4 バイトのグラフ ポインタのサイズを返します。以前に割り当てられたサイズは返しません。

于 2013-09-26T08:04:46.660 に答える
1

はい。sizeof(graph)関数の意味ではありません-それは、通常のポインターでaddStation()ある のサイズになります(おそらく4または8バイト)。graphstruct station *

グラフ内のステーション数のカウントを保持し、realloc()毎回適切なサイズにするために、別の変数が必要になります。

于 2013-09-26T08:05:32.603 に答える