2010-11-23 17 views
0

問題是在STRCPY運行完成後,變量nodeType正在改變。 nodeType不是與STRCPY調用中使用的任何其他變量相關的變量。它在同一個結構中。 nodeType是一個int值爲3的枚舉。使用STRCPY後C編程問題無關的變量被覆蓋

下面是如果下面的信息可能是最相關的。我從枚舉和結構中刪除了大部分變量,因此它們不可見,我認爲它們與問題無關。我在VS2010編碼,如果這有所作爲。這是創建btree的任務的一部分,但是我的問題與btrees無關。

enum NODETYPE 
{ 
    ROOTLEAF 
}; 
typedef struct node 
{ 
    char key[MAX_CHILDREN_ROOT][MAX_KEY_LENGTH]; 
    NODETYPE nodeType; 
} nodeT; 

...的insertElement功能

for (int i = 0; i < (b->tempNode->numberOfKeys - b->searchData.position); i++) 
{ 
    strcpy(b->tempNode->key[b->tempNode->numberOfKeys - i], b->tempNode->key[b->tempNode->numberOfKeys - (i + 1)]); 
} 

的一部分。我調用的函數是插入的元素。在此之前我已經多次調用了該函數,但是這是以下代碼的第一部分正在運行。 STRCPY運行後,nodeType的值爲1280070990.我設置要監視的變量,並在CXX0017錯誤中設置該變量,我認爲這僅表示它不在範圍內。

我擡頭看了1280070990這個數字,它引發了一系列來自各種引擎的遊戲相關問題。我猜想它的內存地址問題。

解決方案是在下面提供的。這是寫入數組邊界之外的簡單錯誤。我像這樣打破了舊代碼,然後穿過它。這讓我能夠識別出我在密鑰陣列鍵之外寫入的問題。

 for (int i = 0; i < (b->tempNode->numberOfKeys - b->searchData.position); i++) 
    { 
     int sourceI = b->tempNode->numberOfKeys - i - 2; 
     int destI = b->tempNode->numberOfKeys - i - 1; 
     char *Source = b->tempNode->key[sourceI]; 
     char *Dest = b->tempNode->key[destI]; 
     strcpy(Dest, Source); 
    } 

全看結構,這兩個變量在。

typedef struct node 
{ 
    node *childrenPTR[MAX_CHILDREN_ROOT]; 
    int depth; //Distance from root to node 
    char key[MAX_CHILDREN_ROOT][MAX_KEY_LENGTH]; 
    NODETYPE nodeType; 
    int numberOfChildren; 
    int numberOfKeys; 
    node *parentPTR; 
} nodeT; 

我們可以從該節點類型如下關鍵的結構體變量的順序看。我相信C會以相同的順序分配內存。所以我也可以看看這裏以確定問題。

+0

聽起來像你的字符串溢出其緩衝區。 – cdhowie 2010-11-23 18:46:30

回答

4

您正在將一個太長的字符串複製到某處的key []中。它溢出到nodeType中。

因爲我猜你是新手,所以我會重新編寫一段代碼,讓你更容易閱讀,以便掌握正在發生的事情。也許是這樣的:

for (int i = 0; i < (b->tempNode->numberOfKeys - b->searchData.position); i++) 
{ 
    char *dest = b->tempNode->key[b->tempNode->numberOfKeys - i]; 
    char *source = b->tempNode->key[b->tempNode->numberOfKeys - (i + 1)]; 
    strcpy(dest, source); 
} 

步行通過調試器和source可能比更長(與空結束 - 你是空終止你的字符串吧?)MAX_KEY_LENGTH某處你的陣列。即使在你的陣列中,它甚至可能是瘋狂的。

將它分解爲更小,更易於調試的步驟。

+0

感謝您的幫助,我忘記了有時候簡單的故障排除步驟,例如將它進一步分解爲相同的調試更容易。 – MykC 2010-11-23 19:40:17

1

這正是如果你使用一個str *函數,這個函數需要一個以空字符結尾的字符串,而不是以空字符結尾的字符串。或者,如果您正在複製的內容不夠大,無法複製到該內容中。