(C언어) 함수에서 받아온 매개변수를 이용한 포인터 활용하려고 하는데 컴파일 오류가없이 바로 꺼져버려서 오류를 못잡겠습니다

조회수 1070회
#include<stdio.h>

int leaf(int *arr,int len)
{
    int **k ;
    k = &arr;
    **(k+1)=2;// 2차 포인터를 넣고 arr의 주소를 집어넣으니까 튕김
}

int main()
{
    int ab[] = {1,5,5,4,5,8,7,7};

    leaf(ab,sizeof(ab)/sizeof(int));

    for(int i=0; i<(sizeof(ab)/sizeof(int)); i++)
    {
        printf("%d",ab[i]); 
    }
}

제가 메인함수에서의 ab 배열을 leaf 함수에 전달하였고, leaf 함수의 *arr은 제가 함수에서 포인터로 선언을 하였기때문에 k를 2차원 포인터로 선언을하고 leaf에서 받아온 매개변수 배열 arr의 주소를 넣으니까 튕기더라고요.

그래서 그냥 1차원 포인터로

#include<stdio.h>

int leaf(int *arr,int len)
{
    int *k ;
    k = arr; //심지어 얘는포인터인데 arr 주소값을 넣지도 않았는데 제가 원하는값이 출력됬네요...
    *(k+1)=2;
}

int main()
{
    int ab[] = {1,5,5,4,5,8,7,7};

    leaf(ab,sizeof(ab)/sizeof(int));

    for(int i=0; i<(sizeof(ab)/sizeof(int)); i++)
    {
        printf("%d",ab[i]);

    }

//근데 여기서 이렇게수정하면
//분명 int *arr 은 arr을 가르키는 포인터일텐데 왜 그런걸까   
}

이런식으로 수정을 하고나니 오류 없이 잘 실행되었습니다. 오히려 오류가 없으니 더더욱 문제가 뭔지 어렵네요.

2 답변

  • int leaf(int *arr,int len)
    {
        int **k ;
        k = &arr;
        **(k+1)=2;// 2차 포인터를 넣고 arr의 주소를 집어넣으니까 튕김
    }
    
    int main()
    {
        int ab[] = {1,5,5,4,5,8,7,7};
    
        leaf(ab,sizeof(ab)/sizeof(int));
    
        for(int i=0; i<(sizeof(ab)/sizeof(int)); i++)
        {
            printf("%d",ab[i]); 
        }
    }
    

    위 코드에서, leaf 에 ab 를 인자로 넘겼으니까, ab 와 arr 이 완전히 동일하다고 생각하는 거죠?

    그런데, 그렇지 않죠. ab@mainarr@leaf ( var@funcfunc함수의 var변수를 줄여서 썼다고 합시다.) 의 은 분명히 같습니다. 하지만, 그 주소는 다를 수 있고, 다릅니다. 그래서, &arr@leaf&ab@main ( &varvar의 포인터(즉 주소)라고 하자고요.) 과 다르죠.

    비주얼 스튜디오 등의 ide에서 디버깅모드로 실행하면서 두가지 변수의 포인터의 값들이 무엇이 되는지 살펴보면 다르다는 걸 확인할 수 있을 겁니다. (또는 포인터값들을 print 해 보아도 되고요.)

  • 궁금해서 그런데요 이걸 굳이 왜 하시는건가요?

    arr은 1차원 배열(포인터)인데, arr의 어드레스에 주소를 접근하는건?

    동작 되는게 웃기는거같은데요

    주소의 주소를 접근 하면 어떻게 될거 같으세요?

    제 생각엔 segment 오류가 나야 정상 같습니다

    그리고 **k 라는 문법이 있나요? 제가 알기론 없는 문법인데요

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

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

(ಠ_ಠ)
(ಠ‿ಠ)