0

これには、緯度、経度、ステーション ID などの情報が含まれています。ファイルから読み取りを行い、値を構造体の配列に格納する関数を作成しました。ここで、これらの構造体の配列を別の構造体の配列に移動したいと考えています。

MapMarker mapInfo[t];
int k;
for(k=0; k < MAX_STATIONS; k++){
    mapInfo[k].location.latitude = stationInfo[k].location.latitude;
    mapInfo[k].location.longitude = stationInfo[k].location.longitude;
    char* stationName = getStationName(stationInfo[k].stationID);
    strcpy(mapInfo[k].markerName, stationName);
}

ただし、これは私のプログラムを壊しています。どうすればこれを修正できますか?

編集:水田の要求に従って:

mapMarker 構造体:

typedef struct{
GeographicPoint location;
char markerName[100];
char markerText[1000];
int type;
} MapMarker;

GeographicPoint の位置は、緯度と経度の構造体に分割されます。

char* getStationName(int stationID){
if (stationID < 0 || stationID >= MAX_STATIONS || !AllStationNames[stationID])
    return "Unknown";
return AllStationNames[stationID];
} /* getStationName */

そして配列

char *AllStationNames[MAX_STATIONS] = {
[1] = "Ian Stewart Complex/Mt. Douglas High School",
[3] = "Strawberry Vale Elementary School",
...
[197] = "RASC Victoria Centre",
[199] = "Trial Island Lightstation",
[200] = "Longacre",
};
4

1 に答える 1

1

tコメントで説明したように、変数をサイズとして使用して VLA (可変長配列) を宣言しています。それは常に以下ですMAX_STATIONS。したがって、バッファオーバーランの問題があります。

MapMarker mapInfo[t];
int k;
for(k=0; k < MAX_STATIONS; k++){
    // Accessing mapInfo[k] when k >= t will have undefined behaviour
}

最も簡単な解決策は、mapInfo定数サイズにしてループすることtです:

MapMarker mapInfo[MAX_STATIONS];
for( k = 0; k < t; k++ ) ...
于 2013-11-12T04:15:42.820 に答える