리눅스 시스템 프로그래밍을 공부하고 있는데요. struct 내에 배열 선언시 int score[0]; 처럼 할 수가 있더군요 도와주세요
글쓴이: ljh665577 / 작성시간: 목, 2015/12/24 - 4:26오후
#include
#include
typedef struct
{
int count;
char name[20];
int score[0];
} FLEX;
int main(void)
{
int i, j;
FLEX *p = (FLEX *)malloc(4096);
for(i=0; i p->score[i] = i + 1;
for(j=0; j printf("p->score[%d] = %d\n", j, p->score[j]);
return 0;
}
결과
p->score[0] = 1
p->score[1] = 2
p->score[2] = 3
p->score[3] = 4
p->score[4] = 5
.
.
.
p->score[95] = 96
p->score[96] = 97
p->score[97] = 98
p->score[98] = 99
p->score[99] = 100
와 같이 나오는데 배열선언을 int score[0]; 로 했는데 어떻게 이게 가능한지 이해가 잘 안갑니다.
도와주세요ㅜㅜ
Forums:
디버깅 해보면... 크기가 0입니다.
- 크기는 0 입니다.
- 주소가 있으니. 사용은 가능합니다.
- 문제는 주소와 값이. 다른 변수등에 의해서 바뀌게 되거나. 다른 메모리를 사용하게 되는 경우 입니다.
이렇게 문자열을 사용하기도 합니다.
----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.
각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com
아랫분이 쓴 것처럼 용도를 자세히 모르는 상태에서
아랫분이 쓴 것처럼 용도를 자세히 모르는 상태에서 답글을 달면 선무당이 사람 잡는 것 이상도 이하도 아닙니다. 네, 당연히 선언을 저렇게 했으니 크기는 0이죠.
네~참고하겠습니다
네~참고하겠습니다
행복한 하루되세요!
여기 한번 읽어보세요
http://minjang.egloos.com/2254472
네 참고하겠습니다~
네 참고하겠습니다~
행복한 하루되세요!
struct hack
C에서 사용하는 관용구(idiom)로서 struct hack 이라고 합니다.
이걸 사용하는 이유는 가변길이 데이터를 쉽게 다룰 수 있기 때문입니다.
예전에는 배열의 크기가 0인걸 허용하지 않아서 1로 했지만 최근 대부분의 C컴파일러들은
struct hack을 사실상 언어 표준으로 인정하고 있어서
과 같은 표현이 가능 합니다.
주의할 점은 struct hack으로 선언된 구조체로 직접 메모리 할당을 하면 안됩니다.
보통 char로 버퍼를 할당 받은 후 캐스팅 해서 사용합니다.
만약 직접 구조체를 이용해서 메모리를 할당 받으려고 하면 컴파일러가
"imcomplete type" 경고를 띄웁니다.
(C++에서 순수 가상 클래스를 이용해서 객체를 생성할 경우와 비슷하다고 보시면 됩니다.)
요약하자면
1. struct hack이라고 불리는 관용구(혹은 기법)으로서 가변길이 데이터를 쉽게 다르기 위함
2. 해당 구조체를 이용해서 직접 메모리 할당 받으면 안된다. 캐스팅해서 써야 한다.
PS.
배열을 [0]으로 선언했는데 메모리 침범 경고 및 런타임 에러가 발생하지 않는 이유는 2) 와 관련있습니다. 또한 기본적으로 C의 배열은 메모리 경계 체크를 하지 않는것도 한 몫 하구요.
생각해보니 괜히 글을 길게 적었네요.KLDP
생각해보니 괜히 글을 길게 적었네요.
KLDP 내에서도 struct hack 관련된 내용이 많습니다.
해당 키워드로 검색되는 다른 글들도 읽어보시길 바랍니다.
C99에서 flexible array member라는
C99에서 flexible array member라는 이름으로 정식으로 편입되었고,
이땐 [0]이 아니라 []으로 씁니다.
구조체의 맨 마지막 맴버 변수에만 허용되는 형태입니다.
그런데 문제는, C++엔 아직 이것이 들어가 있지 않습니다.
자신이 현재 사용하는 컴파일러의 메뉴얼을 확인해 봐야 할 부분입니다.
...
Flexible array member는 C++의 클래스 상속과 충돌하기 때문에 앞으로도 C++에서 지원하지 않을 것 같습니다.
(C++ 쓰면서 가끔씩 아쉬울 때가 있더군요.)
와우 친절한 설명 감사합니다
아직 완벽히 이해가 되지는 않았지만
덕분에 조금 갈피가 잡히네요 감사합니다
행복한 하루되세요!
댓글 달기