Ошибка сегментации, когда я пытаюсь прочитать значения с предварительно выделенной матрицей, переданной по ссылке в функции - PullRequest
0 голосов
/ 27 апреля 2019

Функция имеет два аргумента: указатель на символ и целочисленный тройной указатель.Целочисленный тройной указатель используется для передачи по ссылке целочисленного двойного указателя (чтобы выделить матрицу).

Я уже отлажен, и все идет прямо до второй итерации цикла for, используемого для получения числа.из файла.

void leggimatrice(char *filename, int ***mat)
{
    int counter = 0, i, j, ap;
    FILE *fp;

    //count how many numbers there are in the file
    if ((fp = fopen(filename, "r")) != NULL) {
        while (fscanf(fp, "%d", &i) != EOF)
            counter++;
        fclose(fp);
    }
    //allocate the matrix; the value of counter is 9
    *mat = malloc(sizeof(int *) * sqrt(counter))
        for (i = 0; i < sqrt(counter); i++) {
        (*mat)[i] = (int *) malloc(sizeof(int) * sqrt(counter));
    }

    //reopen the file and save the values in the allocated matrix
    fp = fopen("matrice.txt", "r");
    for (i = 0; i < sqrt(counter); i++) {
        for (j = 0; j < sqrt(counter); j++)
            fscanf(fp, "%d", (mat[i])[j]);
    }
    fclose(fp);

    return;
}

Результатом является ошибка сегментации, которая появляется во время второй итерации первого цикла for (i = 1)

1 Ответ

0 голосов
/ 27 апреля 2019
if ((fp = fopen(filename, "r")) != NULL) {
...
fp = fopen("matrice.txt", "r");

Они не обязательно открывают один и тот же файл, поэтому (если не filename == "matrice.txt") вы можете считать и читать разные файлы.

Настоящая причина SIGSEGV здесь:

fscanf(fp, "%d", (mat[i])[j]);

Это должно быть:

fscanf(fp, "%d", &(*mat)[i][j]);

или эквивалентно:

fscanf(fp, "%d", (*mat)[i] + j);
...