2015-07-05 46 views
2

程序在free()函數調用中觸發斷點。嘗試使用free()處理動態數組時斷點

調試程序返回該消息:

HEAP [C_C.exe]:在00498240 50 C_C.exe的00498298過去請求的大小改性堆塊已經觸發一個斷點。

我不明白爲什麼免費()觸發斷點如果一切似乎是正確的......

#define _CRT_SECURE_NO_WARNINGS 
    #include <stdio.h> 
    #include <string.h> 
    #include <stdlib.h> 
    #define TRUE 1 
    #define FALSE 0 


    int* aloca_vetor(int control) 
    { 
     int *vetor; 
     vetor = (int *)malloc((control * sizeof(int))); 
     return vetor; 
    } 


    int main() 
    { 
     int *vetor; 
     int Input[2]; 
     int testes; 
     int control; 
     int i, j, w = 0; 
     scanf("%d", &testes); 
     while (testes != 0) 
     { 
      scanf("%d%d", &Input[0], &Input[1]); 
      control = ((Input[1] - Input[0]) + 2); 
      vetor = aloca_vetor(control); 
      if (vetor == NULL) 
      { 
       printf("No memory!"); 
      } 
      for (i = 2; i < control; i++) 
      { 
       vetor[i] = TRUE; 
      } 
      for (i = 2; i < control; i++) 
      { 
       if (vetor[i] == TRUE) 
       { 
        j = 0; 
        for (w = 0; j < (control - 1); w++) 
        { 
         j = i*i + w*i; 
         vetor[j] = FALSE; 
        } 
       } 
      } 
      for (i = 0; i < control; i++) 
      { 
       if (vetor[i] == TRUE) 
       { 
        printf("%d\n", i); 
       } 
      } 
      testes--; 
      free(vetor); 
     } 

     return 0; 
    } 
+0

標準警告:不要將'void *'強制轉換爲'malloc'和朋友返回的!還可以使用'stdbool.h'類型/常量作爲布爾值。自定義'#define's et。人。不應該再使用了。 – Olaf

+0

總是檢查'scanf'的結果! – Olaf

+0

請告訴我們您正在使用的輸入信息,以便我們重現問題。但對於初學者來說:'j = i * i + w * i;'當用作索引時,你確定不會溢出'vetor'嗎? – kaylum

回答

2

我認爲問題在這個循環

for (w = 0; j < (control - 1); w++) 
{ 
    j = i*i + w*i; 
    vetor[j] = FALSE; 
} 

它的產生似乎這樣計算的值如下:

j = i*i + w*i; 

ca n大於控制。

你可以重寫像

for (w = 0; (j = i*i + w*i) < (control - 1); w++) 
{ 
    vetor[j] = FALSE; 
} 

而且在我看來,循環

while (testes != 0) 
    { 
     //... 
     testes--; 
     free(vetor); 
    } 

會更可讀,如果它被改寫以下方式

while (testes-- != 0) 
    { 
     //... 
     free(vetor); 
    } 

或環

while (testes--) 
    { 
     //... 
     free(vetor); 
    } 

考慮到你編寫程序的方式似乎沒人理解它的作用:)你應該儘量編寫更具可讀性的程序,即使它們是測試程序。

+0

現在我可以清楚地看到它!我犯了什麼錯誤...... – pct

+0

我只是按照你的建議做了,它的工作,讓我們說「完美」,但我已經發現了代碼上的另一個錯誤!所以讓我們回到編碼!謝謝。 – pct

+0

@ pct歡迎您。:) –

0

j = i*i + w*i將變得比數組的最後一個有效索引大得多。超出數組邊界的訪問呈現undefined behaviour

一個效果可能是覆蓋hep管理使用的內存,因此只有在調用free時纔會看到效果。

相關問題