union 으로 데이터 형을 만들 경우 접근 문제..

murien의 이미지

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 문에서 에러가 뜹니다..
저런 식으로 하면 안되는 건지요...

murien의 이미지

ㅇ ㅏ 그리고 한가지 더 질문드립니다^^
만약!!
char * 로 string이 있다고 할때,
이것이 숫자인지 (ex> "123"이면 yes..."skjk"이면 no)
알 수 있는 방법은 어떤 건지요..?

B00m의 이미지

우선 객체들의 메모리들은 다 잘 활당해 주셨는지 의심이 가구요..

c로 이런식으로 짜고 메모리 할당하고 해제하는것은 참귀찮고 오류를 범하기 쉽습니다.

그리고 printf 실행시 오류가 났다고 하니 printf 에 포멧 스트링이 잘 못된건 아닌지 확인해 보세요.. 죽는거를 보니 주소를 참조하는 %s 같은거를 잘 못 썼다던지..

그리고 숫자인지 구분하는 방법은 c함수인 isidigit 같은 걸로 구현하시면 됩니다.

ㅡ,.ㅡ;;의 이미지

님의 말을 보니.. 읽어봐도 어디에도 메모리를 할당했다는말은 없네요..

메모리를 할당하지 않았으니 당연히 에러가 납니다..

그이유가 아니라면.. 님이 말씀하신것만으로는 오류를 알수 없읍니다.. 님이 언급하지 않은곳에 오류가 있지요..


----------------------------------------------------------------------------

세벌의 이미지

murien wrote:
만약!! char * 로 string이 있다고 할때,
이것이 숫자인지 (ex> "123"이면 yes..."skjk"이면 no)
알 수 있는 방법은 어떤 건지요..?

isdigit() isalpha() 함수를 활용하시면 되겠군요. 함수 선언은 /usr/include/ctype.h 을 참고하세요.

murien의 이미지

답변들 감사합니다^^
그러면~
역시 메모리 잡는 것이 문제인거 같은데요~
union에서 memory를 어떻게 잡아야 할지......
a[f]->item[j]->address->a=(int *)malloc(sizeof(int));
이렇게 하니
오류가 나네요...
(제 생각에도 먼가 이상하다는건 느끼는데 구체적인건...;;)
수련이 부족해서.....union을 잘 못쓰겠습니다..
ㅠ_ㅠ
도와주세요~

ㅡ,.ㅡ;;의 이미지

murien wrote:
답변들 감사합니다^^
그러면~
역시 메모리 잡는 것이 문제인거 같은데요~
union에서 memory를 어떻게 잡아야 할지......
a[f]->item[j]->address->a=(int *)malloc(sizeof(int));
이렇게 하니
오류가 나네요...
(제 생각에도 먼가 이상하다는건 느끼는데 구체적인건...;;)
수련이 부족해서.....union을 잘 못쓰겠습니다..
ㅠ_ㅠ
도와주세요~

음..ㅡㅡ;; 포인터개념을 아직 확실히 이해하지 못한듯 하네요..

상위포인터 메모리가 없는데.. 할당이 당연히 안되죠..ㅡㅡ;;


----------------------------------------------------------------------------

murien의 이미지

앗..

 a[count]=(struct strTable *)malloc(sizeof(struct strTable));

이렇게 해줬는데도 안대네용 ㅠ_ㅠ
aniseeker의 이미지

의도가 무엇인지 알아보기 힘들군요.

union dataType{ 
   int a; 
   char b; 
   float c; 
}; 

a[f]->item[j]->address->a=(int *)malloc(sizeof(int)); 

위의 코드를 보니 포인터의 개념에 대한 이해부족이 원인인 듯 하군요..
sizeof(struct strTable)을 화면에 출력해보세요. 포인터 변수는 주소를 저장하는 녀석일 뿐이죠.
32비트라면 주소 저장공간을 위한 4bytes가 할당됩니다.
포인터가 3개로 구성된 구조체라면 3*4=12bytes 이겠죠.

union dataType *address;의 의미는
address가 메모리 주소를 저장하기 위한 포인터 변수인데 이녀석이 다루는 데이터 타입이 union dataType이구나 라는 거죠. 즉 메모리를 access하는 단위를 union dataType의 크기만큼 하면 되겠구나 하는 겁니다.

그리고 union의 경우는 멤버 중에 가장 큰 녀석을 기준으로 할당됩니다. 제일 큰 놈으로 잡아놓고 골라쓰는 재미가 있지요. :)

어두운 밤에 움직이지 않는 꽃과 개와 물,
어두운 밤에 꽃과 짖는개와 물.

cdpark의 이미지

우선 a[]를 할당하고, 그 다음에 a->item[]을, 그 다음에 a[]->item[]->address를 할당해줘야 합니다.

제시한 코드로 봐서 포인터 배열과 배열 포인터의 개념부터 다시 보셔야 할 듯 싶네요.

이렇게 포인터가 난무하는 코드는 꼭 필요한 게 아니라면 "짜지마세요". 혹은 macro나 함수 등으로 간접적으로 접근하시거나요.

lsj0713의 이미지

murien wrote:
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 문에서 에러가 뜹니다..
저런 식으로 하면 안되는 건지요...

C 코드라 가정하고서 답변해 드리겠습니다.

a[f] 가 다른 변수 혹은 malloc함수에 의해 할당된 공간을 가리키고 있지 않을 경우, a[f]가 가리키는 공간에 접근하는 행위는 정의되지 않은 동작(undefined behavior)을 일으킬 수 있습니다. (아무 일도 없을 수도 있고, 프로그램이나 컴퓨터의 비정상적인 동작에서부터 시작해서 온갖 종류의 일이 일어날 가능성이 있습니다) 이것은 a[f]->item[g]도 마찬가지입니다. 포인터를 사용할 때에는 항상 다른 변수 또는 malloc함수에 의해 할당된 메모리를 가리키고 사용하도록 주의해야 합니다.

아래에 메모리 할당과 해제에 대한 예제 코드를 보여드리겠으니, 그냥 배껴다가 쓰지 마시고 왜 저렇게 되는지 곰곰히 생각해보시고 쓰길 바랍니다.

/* 각각의 요소에 메모리를 할당한다 */
for (i = 0; i < 10; i++)
{
    a[i] = malloc(sizeof(*a[i]));

    /* sructType, structName에 대한 처리 코드 */
    ...
    for (j = 0; j < 10; j++)
    {
        ...
        a[i]->item[j] = malloc(sizeof(*(a[i]->item[j])));
        /* a[i]->item[j] 에 적당한 값을 넣는다 */
        ...
    }
}

...

/* 다 쓰고나서 메모리를 해제한다 */
for (i = 0; i < 10; i++)
{
    for ( j = 0; j < 10; j++ )
    {
        free(a[i]->item[i]);
    }
    /* structType과 structName을 적당히 처리한다 */
    ...

    free(a[i]);
}

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.