Изменение значения массива - PullRequest
0 голосов
/ 14 марта 2012

Итак, у меня две проблемы:

Я использую netbeans для кодирования этого.

Во-первых, значение массива, которое я устанавливаю в c.sArr, меняется с 7к некоторому случайному числу, и я не могу понять, почему.

Во-вторых, когда я пытаюсь запустить отладку в NetBeans, код дает мне segfault, тогда как, когда я запускаю его обычно, он не,Это дает ошибку в функции 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 Ответ

1 голос
/ 14 марта 2012

Вы не выделяете (достаточно) памяти:

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, поведение определяется реализацией: возвращаемое значение должно быть либо нулевым, либо уникальным указателем.

...