(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@main
와arr@leaf
(var@func
을func
함수의var
변수를 줄여서 썼다고 합시다.) 의 값은 분명히 같습니다. 하지만, 그 주소는 다를 수 있고, 다릅니다. 그래서,&arr@leaf
는&ab@main
(&var
을var
의 포인터(즉 주소)라고 하자고요.) 과 다르죠.비주얼 스튜디오 등의 ide에서 디버깅모드로 실행하면서 두가지 변수의 포인터의 값들이 무엇이 되는지 살펴보면 다르다는 걸 확인할 수 있을 겁니다. (또는 포인터값들을 print 해 보아도 되고요.)
-
궁금해서 그런데요 이걸 굳이 왜 하시는건가요?
arr은 1차원 배열(포인터)인데, arr의 어드레스에 주소를 접근하는건?
동작 되는게 웃기는거같은데요
주소의 주소를 접근 하면 어떻게 될거 같으세요?
제 생각엔 segment 오류가 나야 정상 같습니다
그리고 **k 라는 문법이 있나요? 제가 알기론 없는 문법인데요
댓글 입력