구조체 초기화 질문있습니다.

BrownBear의 이미지

ZeroMemory(&ABCStruct, sizeof(ABC));

ABC ABCStruct = { 0, };

이 두개가 같은건가요?

둘 다 0으로 초기화하는건지 아니면 두번째는 주소를 초기화하는건지 궁금하네요.

shint의 이미지

초기화에 주의하시기 바랍니다.

0x00 == NULL == '\0' 은 같습니다. (비트8개가 00000000 인것과 같습니다.)

이와는 다르게. 0 은 숫자. '0' "0" 문자 모두 다릅니다. ASCII 코드표를 참고하시기 바랍니다.

ZeroMemory() 는 범위가 정해지지 않았습니다.
memset() 은 구조체에 한해서 사용이 가능합니다. (클래스 사용시 오류가 있습니다.)

ST_ABC ABCStruct1 = { 2, }; 이 초기화 방법은 뒤에 값이 초기화 되지 않기도 하니. 주의하시기 바랍니다.

ABC 라는 구조체가 wingdi.h 에 이미 있으니. 같은 변수이름을 주의하시기 바랍니다.

자세한 내용은 MSDN 과 책을 참고해보시기 바랍니다.

#include <iostream>
#include <windows.h>
#include <memory.h>
 
 
typedef struct
{
	int a;
	int b;
} ST_ABC;
 
 
void fn(ST_ABC * p)
{
	printf("%x\n", p);
}
 
 
#if 0
wingdi.h
  typedef struct _ABC {
    int abcA;
    UINT abcB;
    int abcC;
  } ABC,*PABC,*NPABC,*LPABC;
#endif
 
 
int main(int argc, char** argv) 
{
 
	ST_ABC ABCStruct1 = { 2, };
	printf("a %d\n", ABCStruct1.a);
	printf("b %d\n", ABCStruct1.b);
	printf("%x\n", ABCStruct1);
	printf("%x\n", &ABCStruct1);
	printf("\n");
 
 
	ST_ABC ABCStruct2;
	ABCStruct2.a = 10;
	ABCStruct2.b = 20;
	ZeroMemory(&ABCStruct2, sizeof(ST_ABC));
	printf("a %d\n", ABCStruct2.a);
	printf("b %d\n", ABCStruct2.b);
	printf("%x\n", ABCStruct2);
	printf("%x\n", &ABCStruct2);
	printf("\n");
 
 
	ST_ABC ABCStruct3;
	ABCStruct3.a = 10;
	ABCStruct3.b = 20;
	memset(&ABCStruct3, 0x00, sizeof(ST_ABC));
	printf("a %d\n", ABCStruct3.a);
	printf("b %d\n", ABCStruct3.b);
	printf("%x\n", ABCStruct3);
	printf("%x\n", &ABCStruct3);
	printf("\n");
 
 
	fn((ST_ABC*)&ABCStruct3);
 
 
	ST_ABC * p;
	p = &ABCStruct3;	
	printf("%x\n", p);
 
	return 0;
}
 
 
#if 0
 
a 2
b 0
2
22fee4
 
a 0
b 0
0
22fedc
 
a 0
b 0
0
22fed4
 
22fed4
22fed4
 
--------------------------------
Process exited after 0.02142 seconds with return value 0
계속하려면 아무 키나 누르십시오 . . .
 
#endif

댓글 첨부 파일: 
첨부파일 크기
Package icon test 구조체 초기화 방법.zip379.56 KB

----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.

매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.

각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com

jick의 이미지

> 0x00 == NULL == '\0' 은 같습니다. (비트8개가 00000000 인것과 같습니다.)

이분 NULL하고 NUL을 헷갈리시는 것 같군요. (헷갈리는 게 그것뿐이면 얼마나 다행이겠냐마는...)

shint의 이미지

unsigned char a = NULL;
printf("NULL    %8x\n", a);
 
a = '\0';
printf("'\\0'    %8x\n", a);
 
a = 0x00;
printf("0x00    %8x\n", a);
 
a = 0;
printf("0       %8x\n", a);
 
a = '0';
printf("'0'     %8x\n", a);
 
NULL           0
'\0'           0
0x00           0
0              0
'0'           30

/* A null pointer constant. */

#if defined (_STDDEF_H) || defined (__need_NULL)
#undef NULL /* in case has defined it. */
#if defined(__GNUG__) && __GNUG__ >= 3
#define NULL __null
#else /* G++ */
#ifndef __cplusplus
#define NULL ((void *)0)
#else /* C++ */
#ifndef _WIN64
#define NULL 0
#else
#define NULL 0LL
#endif /* W64 */
#endif /* C++ */
#endif /* G++ */
#endif /* NULL not defined and or need NULL. */
#undef __need_NULL

----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.

매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.

각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com

익명 사용자의 이미지

우리가 일반적으로 null이라 부르는 것에는 null character와 null pointer의 두종류가 있는데,
잘 구분해서 쓰는 것이 좋습니다.

null character : 내부의 모든 비트가 0인 byte
null pointer constant : 정수 0 혹은 void *형으로 형변환된 0

전자와 후자의 차이는, 그 내부표현에 있습니다.
전자는 그 내부표현이 모든 비트가 0인게 보장되지만 후자는 문법적으로만 0과 동일할 뿐 그 내부표현이 0일 필요는 없습니다.
사실 null pointer 뿐만 아니라 정수형과 포인터형 사이의 변환은 내부표현이 그대로 보존될 필요가 없습니다.
x86에 익숙한 사람들은 납득하지 못하는 부분이기도 한데,
실제로 오래된 구현체 중에는 그런 것들이 있었고,
C FAQ 같은 문서를 보면 그에 대한 여러가지 질문과 답변들이 수록되어 있습니다.

일반적으로 C에서 null pointer는 정수형과 서로 잘 상호변환되므로 섞어써도 이와 관련된 문제를 느끼기 힘들지만,
몇몇 주의해야 할 상황이 분명히 존재합니다.
예를 들자면 비원형 함수를 호출할 때나 가변인자 함수를 호출할 때입니다.
잘 알려진 사례는 unix에서 가변 인자 함수의 execl함수의 마지막 인자로 반드시 0이 아닌 NULL을 해야 하는 것인데,
NULL의 내부 표현이 0이 아닌 곳에서는 이걸 지키지 않으면 문제가 발생합니다.

위에서 인용하신 코드는 C++의 것인데,
C에서는 NULL을 implementation-defined인 값으로 정의하는 데 비해
C++은 void *형에서 다른 포인터 형으로의 암묵적인 형변환이 금지되므로 NULL을 그냥 0으로 정의합니다.
가져온 코드를 보면 상황에 따라 __null, ((void *)0), 0, 0LL등의 여러가지 방식으로 정의를 하지요?

어셈블리에 익숙한 사람들이 간과하는 문제는,
C 또한 고도로 추상화된 고급 언어라는 점입니다.
특정 구현체의 실제 동작에만 매몰되어서 원래의 정의와 의도를 찾아보는 걸 게을리하는 경우가 많은데,
원래의 정의를 찾아볼 생각은 안하고 그런 식으로 특정 구현체에서만 Try&Error로 학습하는건
되게 안좋은 버릇입니다.
되도록이면 권위있는 레퍼런스(제대로 된 책, 표준문서 등)를 찾아보는게 좋고,
하다못해 스택 오버플로우에서 검색어 때려보는 것만도 못합니다.

댓글 달기

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