2012-03-14 40 views
0

所以我有兩個問題:數組值變化

我使用netbeans來編碼。

第一個是,我在c.sArr中設置的數組值是從7更改爲一些隨機數,我不明白爲什麼。

第二個是,當我嘗試在netbeans中運行調試時,代碼給了我一個段錯誤,而當我運行它通常它不。它在atoi函數中給出了段錯誤。

這是怎麼回事?

#include <stdio.h> 
#include <stdlib.h> 
#include "spoonMatrix.c" 

int main(int argc, char** argv) { 
    int iterations; 
    int argCounter = 0; 
    int debug = 1; 
    int i,j,q; 

    if(argc < 2) 
     return -1; 

    if(debug == 1){ 
     for(q=0;q<argc;q++) 
      printf("%s\n", argv[argCounter++]);          //Checking the params 
    } 

    argCounter = 1; 
    iterations = atoi(argv[argCounter++]); 

    if(debug == 1) 
     printf("%d", iterations); 

    for(i=0;i<iterations;i++){ 
     int rows = 0; 
     int columns = 0; 
     int m = 0, n, p, elemCount; 
     int posCount = 0; 
     int temp; 
     cm c; 
     c.row = rows; 
     c.column = columns; 
     c.elems = (char*)calloc(rows*columns, sizeof(char)); 
     c.sArr = (int*)calloc(rows*columns, sizeof(int)); 

     rows = atoi(argv[argCounter++]); 
     columns = atoi(argv[argCounter++]); 

     for(m=0;m<rows*columns;m++) 
     { 
      c.sArr[m] = -2; 
      //printf("Here"); 
     } 

     if(debug == 1) 
     { 
      printf("Rows : Columns - %d : %d\n", rows, columns); 
     } 

     temp = argCounter; 
     printf("argCounter is: %d\n", argCounter); 
     for(elemCount = 0 ; argCounter < temp + rows; argCounter++) 
     { 
      for(n=0; n<columns; n++, elemCount++) 
      { 
       c.elems[elemCount] = argv[argCounter][n]; 
       //if(debug == 1) 
       // printf("%c\t", c.elems[elemCount]); 
       if(c.elems[elemCount]== 's' || c.elems[elemCount] == 'S') 
       { 
        c.sArr[posCount] = elemCount; 
        printf("%c\t%d\t%d\t%d\n", c.elems[elemCount], elemCount, c.sArr[posCount++], posCount); 

       } 
      } 
     } 

     printf("%d\n", c.sArr[0]); 
     if(debug == 1) 
     { 
      for(j=0; j<rows*columns; j++) 
      { 
       printf("%c ", c.elems[j]); 
      } 

      printf("\n"); 

      for(j=0;j<rows*columns;j++) 
      { 
       printf("%d ", c.sArr[j]); 
      } 
     } 
    } 

    return (EXIT_SUCCESS); 
} 

的另一個文件是:

struct charMat{ 
    int row; 
    int column; 
    char* elems; 
    int* sArr; 
}; 

typedef struct charMat cm; 

在匆忙編碼,藉口怪異的調試語句。

感謝

+1

你爲什麼要#include -c文件? – 2012-03-14 12:35:23

+2

*請原諒那些奇怪的調試語句* < - 您仍然可以在10秒內編輯並刪除它們 – 2012-03-14 12:37:06

+0

哪個'atoi'函數? – Saphrosit 2012-03-14 12:38:35

回答

1

你不分配(足夠的)內存:

int rows = 0; 
int columns = 0; 

c.elems = (char*)calloc(rows*columns, sizeof(char)); // rows * columns is 0 
c.sArr = (int*)calloc(rows*columns, sizeof(int)); // rows * columns is 0 

rows = atoi(argv[argCounter++]); 
columns = atoi(argv[argCounter++]); 

從釋放calloc:

如果空間的要求大小爲0,則該行爲 實施-defined:返回的值應該是空的 指針或唯一的指針。

+0

上帝的親愛的母親,我很抱歉,atoi聲明高於分配。 O_O – Achint 2012-03-14 12:52:52

+0

你可能應該注意到,你也不應該使用calloc的返回值。 – 2012-03-14 12:53:51

+0

等一下,他們沒有。我現在只想淹死自己。非常感謝! – Achint 2012-03-14 12:54:04