안녕하세요. 포인터를 쓰다가 어려운점이 있어서 질문드립니다.
#include
void LTC2445_SPI_16bit_command_32bit_data(uint8_t adc_command_high, uint8_t adc_command_low, long* adc_code);
int main()
{
long aa;
char code_high = 1;
char code_low = 1;
uint8_t i;
uint8_t arr_len;
LTC2445_SPI_16bit_command_32bit_data(code_high, code_low, &aa);
printf("%x \n", aa);
}
void LTC2445_SPI_16bit_command_32bit_data(uint8_t adc_command_high, uint8_t adc_command_low, long* adc_code)
{
uint8_t i;
uint8_t arr_len;
char command[4];
//long command[4]; // LTC2445 data and command
command[3] = 0;
command[2] = 0;
command[1] = adc_command_high;
command[0] = adc_command_low;
adc_code = (long *) command;
printf("%x \n", *adc_code);
printf("%d \n", command[0]);
}
안녕하세요 상기 코드를 썻습니다.
저의 의도는 LTC2445함수에서 char 형 배열 command가 long 포인터로 형변환이 되어서 포인터 매개변수인 adc_code에 넣어주면 main함수에서 aa를 printf하면 adc_code에 담긴 변수를 읽을수 있게끔하는 코드인데요,,
함수안에 있는
printf("%x \n", *adc_code);
printf("%d \n", command[0]);
이것은 의도대로 잘 읽히지만
main함수에 있는
printf("%x \n", aa); 이건 의도와는 다른 값이 나오네요 ㅠㅠ
어떻게 해야 할까요? ㅠㅠ
감사합니다.
무슨 출력을 기대했는데 실제론 뭐가 나오더라...까지
무슨 출력을 기대했는데 실제론 뭐가 나오더라...까지 구체적으로 적어주시면 더 빠르고 정확한 답을 얻으실 수 있을 거고요.
abc_code 는 지역 변수이고 이 변수의 값을 아무리 바꿔봤자 main에 영향을 못주죠.
좋은 하루 되세요!
감사드립니다.
질문을 개떡같이 했는데 역시 전문가 분이시라 찰떡같이 알아들으셨네요!!!!
감사합니다. 답변해주신게 제가 궁금했던 부분입니다.
정말 감사드립니다.
음. command[4]는 함수의 지역변수이고 스택
음. command[4]는 함수의 지역변수이고 스택(stack)에 저장됩니다. 함수 복귀후 이전에 사용되었던 스택 공간의 유효성을 보장할 수 없기 때문에 스택 공간의 영역을 넘겨주거나 해서는 안됩니다.
그걸 막기 위해서는 static char command[4] 등으로 하면 되는데 그러면 원자성, reentrant가 깨어집니다.
결론은 C는 call by value입니다. 값만 넣어(넘겨)주세요. 주소를 넘길때는 주의가 필요합니다.
감사합니다.
덕분에 이론적인 부분까지 알게되었네요!
감사드립니다.
댓글 달기