2014-11-03 46 views
1

我已經得到了C代碼。我在GCC-4.8.1上運行時遇到了一個奇怪的行爲(它編譯時沒有警告和錯誤)。
當我輸入R和C爲任意整數(R =Ç),我到輸入動態分配的2D陣列,但是,當I輸入R和C說,分別(R> c)中,我得到一個不發送Windows錯誤。我相信這可能是由於一些非法指針間接,但我不知道它是什麼。 你能幫我找到它嗎?
下面是代碼:
指針在程序中的誤導

#include<stdio.h> 
#include<malloc.h> 
#include<stdlib.h> 

int main() 
{ 
    int no_of_test_cases; 
    int r, c; 
    int i,j; 

    printf("Enter the no of test cases:\n"); 
    scanf("%d", &no_of_test_cases); 
    printf("Enter the no of rows:\n"); 
    scanf("%d", &r); 
    printf("Enter the no of columns:\n"); 
    scanf("%d", &c); 

    r+=2; 
    c+=2; 
    //Dynamically allocate the 2D array 
    char **string_pattern; 
    string_pattern = (char**)malloc(r* sizeof(char*)); 
    if(string_pattern==NULL) 
    { 
     printf("Not enough memory"); 
     exit(0); 
    } 
    for(i=0; i<c; i++) 
    { 
     string_pattern[i] = (char*)malloc(c* sizeof(char)); 
     if(string_pattern[i]==NULL) 
     { 
      printf("Not enough memory"); 
      exit(0); 
     } 
    } 
    //Now lets put a wall around with the character '#' 
    j=0; 
    for(i=0; i<r; i++) 
    { 
     string_pattern[i][j]='#'; 
    } 
    j=0; 
    for(i=0; i<c; i++) 
    { 
     string_pattern[j][i]='#'; 
    } 
    j=c-1; 
    for(i=0; i<r; i++) 
    { 
     string_pattern[i][j]='#'; 
    } 
    j=r-1; 
    for(i=0; i<c; i++) 
    { 
     string_pattern[j][i]='#'; 
    } 
    printf("haha"); 
    //Now lets input the array 
    for(i=1; i<r-1; i++) 
    { 
     for(j=1; j<c-1; j++) 
     { 
      scanf(" %c",&string_pattern[i][j]); /*whitespace preceding the %c is to skip   
    a non whitespace character in the input buffer*/ 
     } 
    } 
    for(i=0; i<r; i++) 
    { 
     for(j=0; j<c; j++) 
     { 
      printf("%c",string_pattern[i][j]); 
     } 
     printf("\n"); 
    } 

    return 0; 
} 
+0

你是什麼輸入和您的預期輸出?此外,內存泄漏,因爲你沒有釋放你分配的內存。 – tillaert 2014-11-03 07:30:40

+0

@tillaert是的,我沒有釋放內存,但爲什麼它爲r和c的特定值工作?預期的輸出很簡單:首先讓我動態分配內存然後讓我輸入數組然後顯示em。 – 2014-11-03 07:32:30

回答

3

眼前的問題是,在你的配置循環,你的每一行分配內存,但你數到列(i < c)數量:

for(i=0; i<c; i++) { 
    string_pattern[i] = (char*)malloc(c* sizeof(char)); 
... 

這必須

for(i=0; i < r; i++) 
      ^^ 

否則,你正在訪問非法索引。 **string_pattern分配足夠的指針了給定的行數,但對於迴路,其對於每行分配的存儲器訪問無效存儲器(例如,R = 3,C = 4):

char **string_pattern = malloc(r* sizeof(char*)); 
+----+ 
| 0 | 
+----+ 
| 1 | 
+----+ 
| 2 | 
+----+ 
. 3 . <= Invalid index for c=3 in for-loop 
...... 
+0

那麼,爲什麼會這樣呢?你能詳細說明嗎?畢竟,對應於r指針我有c個字符。似乎正常 – 2014-11-03 07:41:18

+0

哦,是的!傻我,我看不到它。你是對的 – 2014-11-03 07:44:52