이차원 포인터 배열 읽기 엑세스 위반

조회수 709회

슈트라센 알고리즘을 작성 중인데, 알고리즘은 다 작성했는데, int **c로 넘겨받은 이차원 포인터 배열에 값이 대입이 안돼요.

읽기 엑세스 위반이라고 뜨는데 왜 뜨는지 모르겠어요

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
void read(int **A, int **B, int **C);
void strassen(int row, int **a, int **b, int **c);
void freeArr(int **a, int **b, int **c, int row);

int size;

void main() {
    int** a = NULL;
    int** b = NULL;
    int** c = NULL;

    read(a, b, c);
    strassen(size, a, b, c);

    int i, j;
    printf("Strassen 행렬곱의 결과 : \n");
    for (i = 0;i < 2;i++) {
        for (j = 0;j < 2;j++) {
            printf("%d ", c[i][j]);
        }
        printf("\n");
    }

    free(a, b, c, size);
}

void read(int **A, int **B, int **C) {
    FILE *fp;
    fp = fopen("matrix.txt", "r");

    char buffer[50];
    int dim = 0;
    fgets(buffer, sizeof(buffer), fp);      //buffer에 읽은 문자열 입력
    char *ptr = strtok(buffer, " ");
    dim = atoi(ptr); //행렬의 차원 수

    A = (int**)malloc(sizeof(int*)*dim);
    B = (int**)malloc(sizeof(int*)*dim);
    C = (int**)malloc(sizeof(int*)*dim);

    int i, j;
    for (i = 0;i < dim;i++) {
        A[i] = (int*)malloc(sizeof(int)*dim);
        B[i] = (int*)malloc(sizeof(int)*dim);
        C[i] = (int*)malloc(sizeof(int)*dim);

    }
    for (i = 0;i < dim;i++) {
        for (j = 0;j < dim;j++) {
            C[i][j] = 0;
        }
    }

    //행렬A 입력받음  
    printf("행렬 A:\n");
    fgets(buffer, sizeof(buffer), fp);
    ptr = strtok(buffer, " ");          //빈칸을 기준으로 끊는다
    for (i = 0;i < dim;i++) {
        for (j = 0;j < dim;j++) {
            A[i][j] = atoi(ptr);
            ptr = strtok(NULL, " ");
            printf("%d ", A[i][j]);
        }
        printf("\n");
    }

    //행렬B 입력받음
    printf("행렬 B:\n");
    fgets(buffer, sizeof(buffer), fp);
    ptr = strtok(buffer, " ");          //빈칸을 기준으로 끊는다
    for (i = 0;i < dim;i++) {
        for (j = 0;j < dim;j++) {
            B[i][j] = atoi(ptr);
            ptr = strtok(NULL, " ");
            printf("%d ", B[i][j]);
        }
        printf("\n");
    }

    fclose(fp);
    size = dim;
}

void strassen(int row, int **a, int **b, int **c) {
    int i, j, q;

    if (row <= 2) {
        int i, j, k;
        for (i = 0;i < row;i++) {
            for (j = 0;j < row;j++) {
                //c[i][j] = 0;
                *(*(c + i) + j) = 0;        ///////////////////////////////읽기 엑세스 위반////////////////////////////
                for (k = 0;k < row;k++) {
                    c[i][j] += a[i][k] * b[k][j];
                }
            }
        }
    }
    else {          //배열 동적할당
        int row = size / 2;
        int** p1 = (int**)malloc(sizeof(int*)*row);
        int** p2 = (int**)malloc(sizeof(int*)*row);
        int** p3 = (int**)malloc(sizeof(int*)*row);
        int** p4 = (int**)malloc(sizeof(int*)*row);
        int** p5 = (int**)malloc(sizeof(int*)*row);
        int** p6 = (int**)malloc(sizeof(int*)*row);
        int** p7 = (int**)malloc(sizeof(int*)*row);
        int** temp1 = (int**)malloc(sizeof(int*)*row);
        int** temp2 = (int**)malloc(sizeof(int*)*row);


        for (q = 0;q < row;q++) {       //2차원 배열 동적할당
            int row = (size) / 2;
            p1[q] = (int*)malloc(sizeof(int)*row);
            p2[q] = (int*)malloc(sizeof(int)*row);
            p3[q] = (int*)malloc(sizeof(int)*row);
            p4[q] = (int*)malloc(sizeof(int)*row);
            p5[q] = (int*)malloc(sizeof(int)*row);
            p6[q] = (int*)malloc(sizeof(int)*row);
            p7[q] = (int*)malloc(sizeof(int)*row);
            temp1[q] = (int*)malloc(sizeof(int)*row);
            temp2[q] = (int*)malloc(sizeof(int)*row);

        }

        for (i = 0;i < row;i++) {
            for (j = 0;j < row;j++) {
                temp1[i][j] = 0;
                temp1[i][j] = a[i][j] + a[i + row][j + row];
                temp2[i][j] = b[i][j] + b[i + row][j + row];
            }
        }
        strassen(row, temp1, temp2, p1);        //p1

        for (i = 0;i < row;i++) {
            for (j = 0;j < row;j++) {
                temp1[i][j] = a[i + row][j] + a[i + row][j + row];
                temp2[i][j] = b[i][j];

            }
        }
        strassen(row, temp1, temp2, p2);        //p2

        for (i = 0;i < row;i++) {
            for (j = 0;j < row;j++)
            {
                temp1[i][j] = a[i][j];  // a11
                temp2[i][j] = b[i][j + row] - b[i + row][j + row]; // b12 - b22
            }
        }
        strassen(row, temp1, temp2, p3);  // p3

        for (i = 0;i < row;i++) {
            for (j = 0;j < row;j++) {
                temp1[i][j] = a[i + row][j + row];
                temp2[i][j] = b[i + row][j] - b[i][j]; //b21-b11
            }
        }
        strassen(row, temp1, temp2, p4);    //p4

        for (i = 0;i < row;i++) {
            for (j = 0;j < row;j++) {
                temp1[i][j] = a[i][j] + a[i][j + row];
                temp2[i][j] = b[i + row][j + row];
            }
        }
        strassen(row, temp1, temp2, p5);    //p5

        for (i = 0;i < row;i++) {
            for (j = 0;j < row;j++) {
                temp1[i][j] = a[i + row][j] - a[i][j];
                temp2[i][j] = b[i][j] + b[i][j + row];

            }
        }
        strassen(row, temp1, temp2, p6);

        for (i = 0;i < row;i++) {
            for (j = 0;j < row;j++) {
                temp1[i][j] = a[i][j + row] = a[i + row][j + row];
                temp2[i][j] = b[i + row][j] + b[i + row][j + row];
            }
        }
        strassen(row, temp1, temp2, p7);

        for (i = 0;i < row;i++) {
            for (j = 0;j < row;j++) {
                c[i][j] = p1[i][j] + p4[i][j] - p5[i][j] + p7[i][j]; //c11
                c[i][j + row] = p3[i][j] + p5[i][j]; //c12
                c[i + row][j] = p2[i][j] + p4[i][j]; //c21
                c[i + row][j + row] = p1[i][j] + p3[i][j] - p2[i][j] + p6[i][j]; //c22
            }
        }

        for (j = 0;j < row;j++) // 동적 배열 해제
        {
            free(p7[j]);
            free(p6[j]);
            free(p5[j]);
            free(p4[j]);
            free(p3[j]);
            free(p2[j]);
            free(p1[j]);
            free(temp2[j]);
            free(temp1[j]);
        }

        free(temp2);
        free(temp1);
        free(p7);
        free(p6);
        free(p5);
        free(p4);
        free(p3);
        free(p2);
        free(p1);

    } //크기가 2보다 큰 경우 - else
}

void freeArr(int **a, int **b, int **c, int row) {
    for (int j = 0;j < row;j++) // 동적 배열 해제
    {
        free(a[j]);
        free(b[j]);
        free(c[j]);
    }
    free(a);
    free(b);
    free(c);
}

1 답변

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)