2012-03-14 20 views
0

私は2つの問題があります:配列の値が変更される

私はこれをコード化するためにnetbeansを使用しています。

最初に、私がc.sArrで設定している配列値が7からいくつかの乱数に変更されているのですが、その理由を理解できません。

2番目は、私がnetbeansでデバッグを実行しようとすると、コードは私にsegfaultを与えますが、通常は実行しないと、segfaultになります。それはatoi関数でsegfaultを与えます。

ここでは何が起こっていますか?

#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; 

、奇妙なデバッグ文を言い訳。 callocから

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++]); 

:あなたは(十分な)メモリを割り当てていない

おかげ

+1

なぜあなたは '#include 'しているのですか? –

+2

*奇妙なデバッグ文を許す* < - あなたはまだ10秒以内にそれらを編集して削除するオプションを持っています –

+0

'atoi'関数はどれですか? – Saphrosit

答えて

1

要求されたスペースのサイズが0の場合

は、動作が 実装です-defined:返される値は、NULLポインタ またはユニークポインタのいずれかでなければならない。

+0

神の甘い母、すみません、atoiの声明は配分の上にありました。 O_O – Achint

+0

callocの戻り値もキャストすべきではないことに注意してください。 –

+0

待って、彼らはなかった。私はちょうど今、恥ずべきで溺れて行くつもりです。どうもありがとう! – Achint

関連する問題