union 으로 데이터 형을 만들 경우 접근 문제..
글쓴이: murien / 작성시간: 토, 2003/12/06 - 2:03오전
union dataType{ int a; char b; float c; }; struct ParsingTable{ char *primitive; char *name; union dataType *address; }; struct strTable{ char *structType; char *structName; struct ParsingTable *item[10]; } ; struct strTabke *a[10];
이렇게 union과 structure를 합쳐서 선언 했습니다.
그리고
a[f]->item[g]->address->b에 char형을 넣고
printf("%c",a[f]->item[g]->address->b);
해줬습니다..
그랬더니
컴파일 에러는 안나오고
런타임시 printf 문에서 에러가 뜹니다..
저런 식으로 하면 안되는 건지요...
Forums:
ㅇ ㅏ 그리고 한가지 더 질문드립니다^^만약!! char * 로
ㅇ ㅏ 그리고 한가지 더 질문드립니다^^
만약!!
char * 로 string이 있다고 할때,
이것이 숫자인지 (ex> "123"이면 yes..."skjk"이면 no)
알 수 있는 방법은 어떤 건지요..?
우선 객체들의 메모리들은 다 잘 활당해 주셨는지 의심이 가구요..
우선 객체들의 메모리들은 다 잘 활당해 주셨는지 의심이 가구요..
c로 이런식으로 짜고 메모리 할당하고 해제하는것은 참귀찮고 오류를 범하기 쉽습니다.
그리고 printf 실행시 오류가 났다고 하니 printf 에 포멧 스트링이 잘 못된건 아닌지 확인해 보세요.. 죽는거를 보니 주소를 참조하는 %s 같은거를 잘 못 썼다던지..
그리고 숫자인지 구분하는 방법은 c함수인 isidigit 같은 걸로 구현하시면 됩니다.
님의 말을 보니.. 읽어봐도 어디에도 메모리를 할당했다는말은 없네요..
님의 말을 보니.. 읽어봐도 어디에도 메모리를 할당했다는말은 없네요..
메모리를 할당하지 않았으니 당연히 에러가 납니다..
그이유가 아니라면.. 님이 말씀하신것만으로는 오류를 알수 없읍니다.. 님이 언급하지 않은곳에 오류가 있지요..
----------------------------------------------------------------------------
[quote="murien"]만약!! char * 로 string이 있다
isdigit() isalpha() 함수를 활용하시면 되겠군요. 함수 선언은 /usr/include/ctype.h 을 참고하세요.
세벌 https://sebuls.blogspot.kr/
답변들 감사합니다^^그러면~역시 메모리 잡는 것이 문제인거 같은데
답변들 감사합니다^^
그러면~
역시 메모리 잡는 것이 문제인거 같은데요~
union에서 memory를 어떻게 잡아야 할지......
a[f]->item[j]->address->a=(int *)malloc(sizeof(int));
이렇게 하니
오류가 나네요...
(제 생각에도 먼가 이상하다는건 느끼는데 구체적인건...;;)
수련이 부족해서.....union을 잘 못쓰겠습니다..
ㅠ_ㅠ
도와주세요~
[quote="murien"]답변들 감사합니다^^그러면~역시 메모
음..ㅡㅡ;; 포인터개념을 아직 확실히 이해하지 못한듯 하네요..
상위포인터 메모리가 없는데.. 할당이 당연히 안되죠..ㅡㅡ;;
----------------------------------------------------------------------------
앗..[code:1] a[count]=(stru
앗..
이렇게 해줬는데도 안대네용 ㅠ_ㅠ
의도가 무엇인지 알아보기 힘들군요.[code:1]union dat
의도가 무엇인지 알아보기 힘들군요.
위의 코드를 보니 포인터의 개념에 대한 이해부족이 원인인 듯 하군요..
sizeof(struct strTable)을 화면에 출력해보세요. 포인터 변수는 주소를 저장하는 녀석일 뿐이죠.
32비트라면 주소 저장공간을 위한 4bytes가 할당됩니다.
포인터가 3개로 구성된 구조체라면 3*4=12bytes 이겠죠.
union dataType *address;의 의미는
address가 메모리 주소를 저장하기 위한 포인터 변수인데 이녀석이 다루는 데이터 타입이 union dataType이구나 라는 거죠. 즉 메모리를 access하는 단위를 union dataType의 크기만큼 하면 되겠구나 하는 겁니다.
그리고 union의 경우는 멤버 중에 가장 큰 녀석을 기준으로 할당됩니다. 제일 큰 놈으로 잡아놓고 골라쓰는 재미가 있지요. :)
어두운 밤에 움직이지 않는 꽃과 개와 물,
어두운 밤에 꽃과 짖는개와 물.
우선 a[]를 할당하고, 그 다음에 a->item[]을, 그 다음에
우선 a[]를 할당하고, 그 다음에 a->item[]을, 그 다음에 a[]->item[]->address를 할당해줘야 합니다.
제시한 코드로 봐서 포인터 배열과 배열 포인터의 개념부터 다시 보셔야 할 듯 싶네요.
이렇게 포인터가 난무하는 코드는 꼭 필요한 게 아니라면 "짜지마세요". 혹은 macro나 함수 등으로 간접적으로 접근하시거나요.
Re: union 으로 데이터 형을 만들 경우 접근 문제..
C 코드라 가정하고서 답변해 드리겠습니다.
a[f] 가 다른 변수 혹은 malloc함수에 의해 할당된 공간을 가리키고 있지 않을 경우, a[f]가 가리키는 공간에 접근하는 행위는 정의되지 않은 동작(undefined behavior)을 일으킬 수 있습니다. (아무 일도 없을 수도 있고, 프로그램이나 컴퓨터의 비정상적인 동작에서부터 시작해서 온갖 종류의 일이 일어날 가능성이 있습니다) 이것은 a[f]->item[g]도 마찬가지입니다. 포인터를 사용할 때에는 항상 다른 변수 또는 malloc함수에 의해 할당된 메모리를 가리키고 사용하도록 주의해야 합니다.
아래에 메모리 할당과 해제에 대한 예제 코드를 보여드리겠으니, 그냥 배껴다가 쓰지 마시고 왜 저렇게 되는지 곰곰히 생각해보시고 쓰길 바랍니다.
댓글 달기