2013-10-25 43 views
0

我的程序崩潰,並顯示下列行:堆大小錯誤字符串

警告

:HEAP [maze.exe]: 警告:在00392F30堆塊在過去00392F3B改性請求我的動態大小3

一個字符串

int userReq() { 
char **maze=NULL; 
char *pchar; 
int i, test_cases, cur_test=0; 
int row, col; 

/* gather the amount of test cases */ 
scanf("%d", &test_cases); 
do{ 
    scanf("%d",&row); 
    scanf("%d",&col); 
    /* allocate memory for char pointer row-wise */ 
    maze = (char **) malloc(row*sizeof(char*)); 

    for(i=0;i<row;i++) 
     /* for each cell allocate the num of chars in cell */ 
     maze[i] = (char *) malloc(col*sizeof(char)); 

    for(i=0;i<row;i++) 
     scanf("%s",maze[i]); 
      /* this function does modify the maze by changing some of the spots to a different char */ 
      CallSomeFunctionHere(maze); 


    /* free first the cells then the entire block */ 
    for(i=0;i<row;i++) 
     free(maze[i]); 
    free(maze); 

    cur_test = cur_test + 1; 

}while(cur_test < test_cases); 

/* if we were successful then exit program with 
success */ 
return 0; 

}

我的程序做的邏輯,然後試圖釋放內存崩潰後分配空間。

+2

在C中,不要投入malloc :http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc – Barmar

+0

你的意思是說,當你想釋放權利時你會崩潰? – ncm

+0

你確定問題不在'CallSomeFunctionHere'裏面嗎?還要注意'CallSomeFunctionHere'在循環之外,這是你想要的嗎? 「col」究竟意味着什麼?最大。字符串長度?如果是這樣,你忘記了空終止符的空間。 –

回答

0

你忘了在字符串結尾的空分配空間:

maze[i] = malloc((col+1)*sizeof(char)); 
3

這意味着,您所要求的比你需要更少的內存。最有可能的罪魁禍首是這一行:

maze[i] = (char *) malloc(col*sizeof(char)); 

既然你是路過maze[i]scanf作爲%s目標,你需要額外撥款char爲空終止。

將輸入限制爲您分配的內容是一個非常好的主意。考慮使用fgets代替scanf

for(i=0;i<row;i++) 
    fgets(maze[i], col+1, stdin); 

附:在C中,您不需要投射malloc。您也不需要乘以sizeof(char),因爲該標準要求爲1

maze[i] = malloc(col+1); 
+0

非常感謝你的幫助它解決了問題! – cat

+0

@cat不客氣!如果問題現在已解決,請考慮通過點擊旁邊的灰色複選標記來接受答案。這可以讓網站的其他訪問者知道您不再需要尋找改進的解決方案,並且可以在Stack Overflow上爲您獲得新徽章。 – dasblinkenlight

1
maze[i] = (char *) malloc(col*sizeof(char)); 

你不爲一個字符串結束分配空間。更改爲:

maze[i] = malloc(col + 1); 

注意sizeof(char)是1定義,並且你不需要從malloc類型轉換的返回值。

有2個地方的緩衝區可以得到溢出:

scanf("%s",maze[i]); 

變化:

scanf("%.*s", col, maze[i]); 

最後一個地方是:

CallSomeFunctionHere(maze); 

(我沒有這個的源代碼。)