2차원 배열 포인터를 연습하는 과정에서 2차원 배열을 포인터 배열로 인자를 주고 다시 return 받는 함수를 만들었습니다.
#include <stdio.h>
float ( *proc ( float(*mat)[4] ) )[4]
{
float result[4][4];
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 4; j++)
{
result[i][j] = mat[i][j];
}
}
return result;
}
void main()
{
float a[4][4] = { 1, 2, 3, 4,5,6,7,8,9,10,11,12,13,14,15,16 };
float(*b)[4];
b = proc(a);
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 4; j++)
{
printf("%f ", b[i][j]);
}printf("\n");
}
}
아래는 결과입니다.
이때 main함수에서 포인터배열 b를 이제 하나하나 찍어두는데
컴파일도 되고 실행도 되지만 값이 a와 같은 값이 찍히지 않습니다.
그래서 실험을 해보았습니다.
위의 proc함수는 그대로 사용하였으므로
생략하고 실헌한main함수만 기록하겠습니다.
실험 1.
void main()
{
float a[4][4] = { 1, 2, 3, 4,5,6,7,8,9,10,11,12,13,14,15,16 };
float(*b)[4];
b = proc(a);
printf("%f \n", b[0][0]); // 각각 따로따로 출력해보았습니다.
printf("%f \n", b[0][1]);
printf("%f \n", b[0][2]);
printf("%f \n", b[0][3]);
}
결과
실험 2.
void main()
{
float a[4][4] = { 1, 2, 3, 4,5,6,7,8,9,10,11,12,13,14,15,16 };
float(*b)[4];
b = proc(a);
//printf("%f \n", b[0][0]);
printf("%f \n", b[0][1]); // 0,0을 제외하고 0,1부터 출력해보았습니다.
printf("%f \n", b[0][2]);
printf("%f \n", b[0][3]);
/*
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 4; j++)
{
printf("%f ", b[i][j]);
}printf("\n");
}*/
}
결과
이런식으로 b값을 연속적으로 출력하게 되면 첫번째 값을 제외한 나머지 값들이 전부 쓰레기 값이 출력되는것 같습니다.
그래서
주소값을 출력해보았습니다.
void main()
{
float a[4][4] = { 1, 2, 3, 4,5,6,7,8,9,10,11,12,13,14,15,16 };
float(*b)[4];
b = proc(a);
printf("%d \n", sizeof(float (*)[4])); // b의 자료형 크기 출력
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 4; j++)
{
printf("%p \n", &b[i][j]); // 각 원소의 주소출력
}
}
}
결과
이런식으로 주소는 모두 연속적입니다...
아직도 원인을 모르겠어서...이렇게
질문을 남깁니다!!
도와주시면 정말 감사드리겠습니다...!!!!