2012-03-14 63 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