[완료] c언어 구조체에서 마지막에 char name[1]; 과 같이 크기 1의 배열 생성해주는 이유?

syayiyip의 이미지

// 정의
typedef struct _FILE_FULL_EA_INFORMATION
{
ULONG NextEntryOffset;
UCHAR Flags;
UCHAR EaNameLength;
USHORT EaValueLength;
CHAR EaName[1];
} FILE_FULL_EA_INFORMATION, *PFILE_FULL_EA_INFORMATION;

// 사용 예
char EA_Buffer[sizeof(FILE_FULL_EA_INFORMATION) + TDI_TRANSPORT_ADDRESS_LENGTH + sizeof(TA_IP_ADDRESS)];
PFILE_FULL_EA_INFORMATION pEA_Buffer = (PFILE_FULL_EA_INFORMATINO)EA_Buffer;
...
memcpy(pEA_Buffer->EaName, "abcdefghijklmnopqrs", pEA_Buffer->EaNameLength + 1);

-----

위의 예처럼 FILE_FULL_EA_INFORMATION 의 마지막에 EaName을 선언할 때 그냥 포인터 형으로 선언하지 않고 크기 1을 주고 나서는 사용하는데요
이유가 있는 건가요?

이런식의 사용이 FILE_FULL_EA_INFORMATION 구조체 말고도 다른 구조체에서 종종 보여서요...
조언 부탁드립니다.

Fe.head의 이미지

memcpy(pEA_Buffer->EaName, "abcdefghijklmnopqrs", pEA_Buffer->EaNameLength + 1);

위와 같이 사용할수 있게끔 하기 위해서입니다.
버퍼 다음번지를 직접 접근이 가능합니다.

포인터로 쓴다면 사용법이 달라지죠

// 정의
typedef struct _FILE_FULL_EA_INFORMATION
{
  ULONG NextEntryOffset;
  UCHAR Flags;
  UCHAR EaNameLength;
  USHORT EaValueLength;
  CHAR * EaName;              // 포인터로 바꾸었음
} FILE_FULL_EA_INFORMATION, *PFILE_FULL_EA_INFORMATION;
 
...
 
// 다음번지 포인터 설정 후 사용.
pEA_Buffer->EaName = &pEA_Buffer->EaName;
memcpy(pEA_Buffer->EaName, "abcdefghijklmnopqrs", pEA_Buffer->EaNameLength + 1);

고작 블로킹 하나, 고작 25점 중에 1점, 고작 부활동
"만약 그 순간이 온다면 그때가 네가 배구에 빠지는 순간이야"

bushi의 이미지

망가질 것 같은데요...

pEA_Buffer->EaName = (char *)(pEA_Buffer + 1);
Fe.head의 이미지

생각해보니 삭제 되겠군요.

memcpy( &pEA_Buffer->EaName, data, data_size );

가 맞겠군요.

고작 블로킹 하나, 고작 25점 중에 1점, 고작 부활동
"만약 그 순간이 온다면 그때가 네가 배구에 빠지는 순간이야"

bushi의 이미지

그건 더 터무니없죠.

Fe.head의 이미지

왜 안될까요?

되긴 합니다.

문제가 많은 코드이긴 합니다만..

터무니 없다란 말에 욱하네요.

include <stdio.h>
#include <string.h>
 
struct  st_Header
{
    char    l[4];
    char    *data;
};
 
 
typedef struct st_Header    Header;
 
 
int main()
{
    char buf[4+16];
    Header *    p = (Header*)buf;
 
    memset(p->l, 'B', 4);
    memset(&p->data, 0, 16);
    memset(&p->data, 'A', 15);
 
    printf("%s\n", buf);
 
    return 0;
}
 
결과값
 
BBBBAAAAAAAAAAAAAAA

고작 블로킹 하나, 고작 25점 중에 1점, 고작 부활동
"만약 그 순간이 온다면 그때가 네가 배구에 빠지는 순간이야"

bushi의 이미지

돌아는 가겠죠.
그 코드에선 data 멤버의 type이 무엇이건 상관없고,
(char *) 의 의미는 보는 사람 헷갈리게 만드는 것 이상도 이하도 아니니까요.

객관적으로, 누가 이런 코드를 들고오면 뭐라고 평가하실건가요 ?

Fe.head의 이미지

네. 코드가 엉터리인거 인정합니다.

지적해주신거 감사합니다.

고작 블로킹 하나, 고작 25점 중에 1점, 고작 부활동
"만약 그 순간이 온다면 그때가 네가 배구에 빠지는 순간이야"

bootmeta의 이미지

data 영역을 따로 malloc으로 잡고 나서, header의 data가 해당 영역의 주소를 가르키도록 해야합니다.

물론 위 코드 예제는 돌아가기는 합니다만, data크기 16 대신 2를 넣으면 문제가 있는 코드가 되죠.
(역시 돌아가기는 합니다만, 영역 크기가 정확히 맞지 않지 않습니다.
더우기, char *data의 값이 pointer임에도 해당 값을 일반 data 영역으로 간주하므로, 의미상 혼란이 오게됩니다.)

struct  st_Header
{
    char    l[4];
    char    *data;  // pointer이므로 크기 4(32bit machine)
                    // char data[1];로 되어있으면 크기 1
};
bushi의 이미지

data 를 포인터로 사용할 때만 말씀하신 문제가 나타납니다.
Fe.Head 님의 코드에선 offset 을 얻기위한 용도 밖엔 의미가 없으므로 관계 없고요.

bushi의 이미지

그 자료를 네트웍으로 다른 곳에 전송해야 한다거나 파일에 저장해야 할 때를 생각해보세요.
포인터로 했다면 두 번 읽어서 두 번 써야하고, 포인터 자체는 제외되도록 신경써야 합니다.

kaeri17의 이미지

freestyle의 이미지

----------------------------------------------------------------------------------------
Don't Feed the Trolls!
----------------------------------------------------------------------------------------

syayiyip의 이미지

답변해주신 모든 분들 감사드립니다.
큰 도움이 되었습니다.

bootmeta의 이미지

엄한 답을 달아 삭제.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.