SegFault при доступе к выделенному массиву из другой функции - PullRequest
0 голосов
/ 08 февраля 2020

Прошел год с тех пор, как я кодировал C, но я не понимаю, почему это segfaulting

// Assume all imports are made

int printAgain(double** array, int size) {

    int i = 0;
    while(i < size) {
        printf("Value: %f\n", *array[i]);
        ++i;
    }

    return 0;
}



int main(int argc, char *argv[]) {

    int size = 10;

    // Want an array of size 10 that contains doubles
    double *array = malloc(size * sizeof(double));

    if(array) {

        int i = 0;
        while(i < size) {

            // Doing irrelavent stuff here

            double value = 1.5; // 1.5 is random # I picked for this example
            array[i] = value;

            printf("Added to array: %f\n", array[i]);
            ++i;
        }

        printAgain(&array, size);

        free(array);
        return 0;
    }
}

Первый оператор печати в main работает нормально, но в printAgain он напечатает первый элемент массива, но при попытке печати второго элемента возникнет ошибка.

Я полагаю, что я правильно распределяю, назначая точки массива значениям для l oop затем отправка адреса массива в функцию printAgain. В этой функции я отменяю ссылку на данный адрес, чтобы получить доступ к массиву и распечатать его содержимое. Я знаю, что ошибка seg возникает при доступе за пределы / недопустимое пространство памяти, но я не понимаю, как это могло произойти, так как я «верю», что правильно выделил и передал адрес в массив из main.

I Я знаю, что я упускаю что-то чрезвычайно простое и элементарное, но я думаю, это то, что может сделать для вас 1 год не кодирования на языке, так что извините за это.

1 Ответ

1 голос
/ 08 февраля 2020

В main, array уже является указателем. Вам лучше передать его, используя printAgain(array, size); вместо printAgain(&array, size);. В связи с этим необходимо изменить оформление функции с int printAgain(double **array, int size) на int printAgain(double *array, int size).

int printAgain(double *array, int size) {
    int i = 0;

    while (i < size) {
        printf("Value: %f\n", array[i]);
        ++i;
    }

    return 0;
}

int main(int argc, char *argv[]) {
    int size = 10;
    double *array = malloc(size * sizeof(double));

    if (array) {
        int i = 0;

        while (i < size) {
            double value = 1.5; // 1.5 is random # I picked for this example
            array[i] = value;
            printf("Added to array: %f\n", array[i]);
            ++i;
        }

        printAgain(array, size);

        free(array);
        return 0;
    }
}
...