ошибки указателя сегмента - PullRequest
0 голосов
/ 21 ноября 2018

Привет, ребята, это мой код:

#include <stdio.h>
#include <stdlib.h>

int power(int a, int b) {
    int exponent = b, result = 1;
    while (exponent != 0) {
        result = result * a;
        exponent--;
    }
    //printf("%d",result);
    return result;
}

int fill_it(char ** p, int N, int fliptimes, int column2) {
    if (N < 0) return 0;
    int counter = 0, l;
    char a = 'H';
    for (l = 0; l < power(2, fliptimes); l++) {
        p[l][column2] = a;
        counter++;
        if (counter == (power(2, N) / 2)) {
            counter = 0;
            if (a == 'H') a = 'T';
            if (a == 'T') a = 'H';
        }
    }
    fill_it(p, N--, fliptimes, column2++);
}

int main() {
    int i, fores, j, l, m;
    char ** p;
    printf("how many times did you toss the coin?:");
    scanf("%d", & fores);
    p = (char ** ) malloc((power(2, fores)) * sizeof(char * ));
    for (i = 0; i < fores; i++)
        p[i] = (char * ) malloc(fores * sizeof(char));
    fill_it(p, fores, fores, 0);
    for (l = 0; l < power(2, fores); l++) {
        for (m = 0; m < fores; m++) {
            printf("%c", p[l][m]);
        }
    }
    printf(",");
}

он компилируется. Но когда я запускаю программу, она возвращает ошибку "ошибка сегментирования (сброшено ядро)"

я знаю этоозначает, что я пытался получить доступ к памяти, у меня нет доступа, но я не понимаю, какая часть программы неисправна

1 Ответ

0 голосов
/ 21 ноября 2018

Проблема в том, что вы недостаточно выделяете память.Эта строка в порядке

p = (char ** ) malloc((power(2, fores)) * sizeof(char * ));

, но этот цикл выделяет память только для части двумерного массива.

for (i = 0; i < fores; i++)
    p[i] = (char * ) malloc(fores * sizeof(char));

Распределение памяти должно выглядеть примерно так ...

foresSquared = power(2, fores);
p = malloc(foresSquared*sizeof(char *));
for (i = 0; i < foresSquared; i++)
    p[i] = malloc(fores);

Поскольку результат power будет согласованным, имеет смысл сохранить значение в переменной и использовать его, а не пересчитывать.Это также сделает код более понятным.

Вам также не нужно приводить возвращаемое значение malloc, поскольку C обрабатывает это для вас.И sizeof(char) не нужен, поскольку он всегда равен 1.

...