2012-03-14 7 views
0

그래서 두 가지 문제가 있습니다.배열 값이 변경됨

저는 이것을 코딩하기 위해 netbeans를 사용하고 있습니다.

첫 번째는 c.sArr에서 설정하는 배열 값이 7에서 임의의 숫자로 변경된다는 것입니다. 이유는 알 수 없습니다.

두 번째는 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; 

이, 이상한 디버깅 문을 변명.

감사

+1

왜 .c 파일을'포함합니까? ' –

+2

* 이상한 디버깅 구문을 용서할 수 있습니다. * <- 여전히 10 초 이내에 편집하고 삭제할 수 있습니다. –

+0

어떤 atoi가 작동합니까? – Saphrosit

답변

1

당신은 할당되지 않습니다 (충분한) 메모리 :은 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++]); 

는 :

이 동작은 구현

요청하는 공간의 크기가 0 인 경우이다 -defined : 반환 된 값은 null 포인터 또는 고유 한 포인터 여야합니다.

+0

신의 달콤한 엄마, 미안 해요, atoi 진술은 배부금 위에있었습니다. O_O – Achint

+0

calloc의 반환 값도 캐스팅하지 않아야합니다. –

+0

잠깐, 그렇지 않았습니다. 나는 지금 당장 수치에 빠져 죽을거야. 고마워요! – Achint