임의의 a를 입력받아 axa크기의 이미지와 같은 달팽이배열을 만드는데,

중간에 주석을 보면 알겠지만 4x4라고 가정하고 직접 적었을때에는 문제없이 되었고,

그 후 a를 입력받고 a를 통해 배열을 채우려고 시도했지만 a에 3이나 4를 넣었을때 segment fault 가 뜨네요

몇번 직접 계산해봤는데 for통한거나 직접 적는거나 차이가 없어보이는데 대체 뭐가 문제일까요

가독성올려주는 사이트썼는데 폰이라 그런지 적용해서 복붙이 안되네요;;

코드 다 올리긴하겠지만 main의 for쪽만 봐도 되지않나 싶어요

초보자라 코드 난잡해요 난잡한부분도 지적해주면 ㄱㅅㄱㅅ

알고리즘이 궁금한게아니라 segmentfault가 뜨는 이유가 궁금해요
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

#include <stdio.h>
int void1 = 0;
int void2 = 0;
int *pn1 = &void1;
int *pn2 = &void2;

int checkarr(int length, int (*arr1)[length])
{
    int num1 = 1;
    for (int n1 = 0; n1 < length; n1++)
    {
        for (int n2 = 0; n2 < length; n2++)
        {
            num1 *= (arr1[n1][n2]);
        }
    }
    return num1;
}

void voidarr(int length, int (*arr1)[length])
{
    for (int n1 = 0; n1 < length; n1++)
    {
        for (int n2 = 0; n2 < length; n2++)
        {
            arr1[n1][n2] = 0;
        }
    }
}

void printfarr(int length, int (*arr1)[length])
{
    for (int n1 = 0; n1 < length; n1++)
    {
        for (int n2 = 0; n2 < length; n2++)
        {
            printf("%3d", arr1[n1][n2]);
        }
        printf("\n");
    }
}

void _arr(int length, int (*arr1)[length], int n1, int n2, int n3, int *pn3, int n4)
{
    if (n4 == 0)
    {
        {
            do
            {
                if (arr1[n1][n2] == 0)
                {
                    arr1[n1][n2] = n3;
                    n3++;
                    n2++;
                }
                else
                    break;
            } while (!((n2 == 0) || (n2 == length)));
        }
        *pn2 = n2 - 1;
    }
    else
    {
        do
        {
            if (arr1[n1][n2] == 0)
            {
                arr1[n1][n2] = n3;
                n3++;
                n2--;
            }
            else
            {
                break;
            }
        } while (!((n2 == -1) || (n2 == length)));
        *pn2 = n2 + 1;
    }
    *pn1 = n1;
    *pn3 = n3;
}

int larr(int length, int (*arr1)[length], int n1, int n2, int n3, int *pn3, int n4)
{
    if (n4 == 0)
    {
        {
            do
            {
                if (arr1[n1][n2] == 0)
                {
                    arr1[n1][n2] = n3;
                    n3++;
                    n1++;
                }
                else
                {
                    break;
                }
            } while (!((n1 == 0) || (n1 == length)));
            *pn1 = n1 - 1;
        }
    }
    else
    {
        do
        {
            if (arr1[n1][n2] == 0)
            {
                arr1[n1][n2] = n3;
                n3++;
                n1--;
            }
            else
            {
                break;
            }
        } while (!((n1 == -1) || (n1 == length)));
        *pn1 = n1 + 1;
    }
    *pn2 = n2;
    *pn3 = n3;
}

int main(int argc, char *argv[])
{
    int x = 1;
    int a = 0;
    int b = 1;
    int *pb = &b;
    scanf("%d", &a);
    int arr1[a][a];
    voidarr(a, arr1);
    //    if44
   
    //_arr(4, arr1, *pn1, *pn2, b, pb, 0);
   // larr(4, arr1, *pn1 + 1, *pn2, b, pb, 0);
    //_arr(4, arr1, *pn1, *pn2 - 1, b, pb, 1);
    //larr(4, arr1, *pn1 - 1, *pn2, b, pb, 1);
    //_arr(4, arr1, *pn1, *pn2 + 1, b, pb, 0);
    //larr(4, arr1, *pn1 + 1, *pn2, b, pb, 0);
    //_arr(4, arr1, *pn1, *pn2 - 1, b, pb, 1);

   


    for (; !(checkarr(a, arr1)); x++)
    {
   
        if(x==1)
        {
            _arr(a, arr1, *pn1, *pn2, b, pb, 0);
            larr(a, arr1, *pn1 + 1, *pn2, b, pb, 0);
        }
      
       
        else if ((x % 2) == 0)
        {
            _arr(a, arr1, *pn1, *pn2 - 1, b, pb, 1);
            larr(a, arr1, *pn1 - 1, *pn2, b, pb, 1);
        }
       
       
       else if ((x % 2) == 1)
        {
            _arr(a, arr1, *pn1, *pn2 - 1, b, pb, 0);
           larr(a, arr1, *pn1 - 1, *pn2, b, pb, 0);
        }
       
    }
   
printfarr(a, arr1);


    return 0;
}

for 주석 해제 직접적은거 주석

for주석 직접적은거 주석 해제

- dc official App