2013-10-05 51 views
2

「CRT檢測到應用程序寫入堆緩衝區的內存末尾」錯誤。它到達free時崩潰。任何幫助表示讚賞。檢測到堆損壞:正常塊後

int messageFunction(char* message) { 
    char* sPtr = strstr(message,"Subject:"); 
    char* cPtr = strstr(message,"Content:"); 

    char* messageSubject = (char*) malloc(cPtr - sPtr - strlen("Subject:")) 
    char* messageContent = (char*) malloc(strlen(cPtr + strlen("Content:"))) 

    strncpy(messageSubject, 
      stPtr + strlen("Subject:"), 
      cPtr - sPtr - strlen("Subject:")); 

    messageSubject[cPtr - sPtr - strlen("Subject:")] = '\0'; 

    strncpy(messageContent, 
      cPtr + strlen("Content:"), 
      strlen(cPtr + strlen("Content:"))); 
    ... 
    free(messageSubject); 
    free(messageContent); 
    } 


void main() { 
    char* message = "Subject:HelloWorldContent:MessageContent"; 
    int result = messageFunction(message); 
} 

回答

5

您正在分配一個字節太短的內存。您的計算是針對例如「主題:」和「內容:」,但不考慮字符串中是否需要空終止符。然後,當您手動添加空終止符時,通過寫入超過數組的末尾來調用未定義的行爲。

將您的代碼更改爲以下內容應解決此問題。

char* messageSubject = malloc(cPtr - sPtr - strlen("Subject:") + 1) 
char* messageContent = malloc(strlen(cPtr + strlen("Content:")) + 1) 

您還沒有顯示的「...」部分中的代碼,所以你可能有一個未終止字符串,在那裏,如果它是由字符串處理庫程序可能會導致問題。

+0

謝謝先生,你救了我的一天。我將我的代碼從char數組轉換爲char指針,並且錯誤保留了數組長度,必須將+1增加爲+1(空終止符)。 – ozanmuyes

0

如果你這樣做:

char* v = malloc(n); 

V範圍內的有效然後從標到v[0]v[n-1]。特別是,v [n]永遠不會有效。這是一條通用規則。如果你再看看你的代碼,你應該看到這個問題。

有兩點要注意:

  1. 你的代碼假定主題:來之前的內容:和他們兩人的存在。這種假設在某些情況下將不會是正確的。你應該在開始malloc'ing大量的內存之前檢查(因爲小的負數變成巨大的積極無符號數)。你也應該確保你的malloc不會返回0,而不是在他們這樣做時進行分割。

  2. strdup(和strndup)通常會讓您免於尷尬的「哎呀,我沒有爲NUL字節分配足夠的空間」錯誤。它們也不需要太多的東西,使您的代碼更簡單,更可靠,更易於理解。瞭解他們。他們將成爲你的朋友。

  3. 如果沒有其他的工作,valgrind可以幫助你找到這樣的錯誤。