memset에 좋은 방법은?

dreamer의 이미지

char buf[4][16];
로 배열을 잡았습니다.
이것을 0xff로 모두 초기화를 하고 싶은데..
가장 좋은 방법은?

1.
for(i = 0; i < 4; i++)
memset(&buf[i], 0xff, 16);

아니면 이게 가능한가요?
2.
memset(buf, 0xff, 64);

물론 선언시에
3.
char buf[4][16] = {0xff};
가능 한가요?

지금은 1번의 경우로 초기화를 하는데.. 좋은 방법이 있으면 추천해주세요..

hey의 이미지

2번처럼 하기도 합니다.

char buf[width][height];
memset(buf, 0, sizeof(buf));


----------------------------
May the F/OSS be with you..


cbycby의 이미지

저도 위에분처럼 2번을 즐겨 사용합니다.
다른 이유는 없구요... 편해서요~

http://www.korone.net QT 커뮤니티 사이트

advanced의 이미지

dreamer wrote:
char buf[4][16];
로 배열을 잡았습니다.
이것을 0xff로 모두 초기화를 하고 싶은데..
가장 좋은 방법은?

1.
for(i = 0; i < 4; i++)
memset(&buf[i], 0xff, 16);

아니면 이게 가능한가요?
2.
memset(buf, 0xff, 64);


2번 가능합니다

dreamer wrote:

물론 선언시에
3.
char buf[4][16] = {0xff};
가능 한가요?

지금은 1번의 경우로 초기화를 하는데.. 좋은 방법이 있으면 추천해주세요

3번 같은 경우는 전부가 아닌 일부만 초기화 하면 나머지는 0으로 초기화 하는걸로 알고 있습니다

dreamer의 이미지

음 배열이 연속으로 잡히죠.. 기초를 확실히 해야 하는데.. ^^
2번이 젤 쉽고 깔끔하겟네요..

또 하난 궁금한게 생겻는데,

memset(&buf[1], 0xff, 16);
하고
memset(buf[1], 0xff, 16);
은 같은 가요?
실제로 컴파일 하고 돌려보면 동작은 같이 하는데...

moonzoo의 이미지

dreamer wrote:
음 배열이 연속으로 잡히죠.. 기초를 확실히 해야 하는데.. ^^
2번이 젤 쉽고 깔끔하겟네요..

또 하난 궁금한게 생겻는데,

memset(&buf[1], 0xff, 16);
하고
memset(buf[1], 0xff, 16);
은 같은 가요?
실제로 컴파일 하고 돌려보면 동작은 같이 하는데...

char buf[4][16]; 과 같이 이차원 배열일 경우에

buf[1] 과 &buf[1]은 모두 buf[1][0]의 주소를 가리키므로

같은 값입니다.

&를 붙이는 편이 문맥상 좀더 좋아보입니다만.. 스타일이겠죠.

crimsoncream의 이미지

gcc나 iso c99를 쓰신다면 3번 비슷하게도 가능합니다.

int
main ()
{
  int i;
  int a[][2] = {[0...5][0] = 10,[0...5][1] = 12 };
  int b[][2] = {[0...5][0...1] = 10 };
  int c[][2] = {[0...5] = {10, 11} };

  printf ("length:%d:%d\n\n", sizeof (a), sizeof (a[0][0]));
  i = 0;
  while (i < (sizeof (a) / sizeof (a[0][0])))
    {
      printf ("a:%d: %d\n", i, *(((int *) a) + i));
      i++;
    }
  printf ("\n");

  i = 0;
  while (i < (sizeof (b) / sizeof (b[0][0])))
    {
      printf ("b:%d: %d\n", i, *(((int *) b) + i));
      i++;
    }
  printf ("\n");

  i = 0;
  while (i < (sizeof (c) / sizeof (c[0][0])))
    {
      printf ("c:%d: %d\n", i, *(((int *) c) + i));
      i++;
    }
  printf ("\n");

  return 0;
}

오늘 우리는 동지를 땅에 묻었습니다. 그러나 땅은 이제 우리들의 것입니다.
아직도 우리의 적은 강합니다. 그러나 우리는 그들보다 많습니다.
항상 많을 것입니다.

ted78의 이미지

저 같은 경우는 보통 배열크기 같은 것은 define으로 빼는 편이라

#define AA 10
#define BB 20
...
memset(buf, 0xff, AA*BB); 이런 스타일을 씁니다만 --;

나는 생각하는 갈대다?

lsj0713의 이미지

dreamer wrote:
또 하난 궁금한게 생겻는데,

memset(&buf[1], 0xff, 16);
하고
memset(buf[1], 0xff, 16);
은 같은 가요?
실제로 컴파일 하고 돌려보면 동작은 같이 하는데...

보통 포인터를 쓸 때는 그것이 가리키고 있는 주소값만을 신경쓰는 경우가 많은데, 주소값 외에도 포인터가 가리키고 있는 데이터의 타입(혹은 포인터가 가리키고 있는 데이터의 크기)에도 신경을 쓰는 것이 좋습니다. &buf[1]와 buf[1]는 같은 주소값을 가리키지만 그 데이터형(혹은 그것들이 가리키는 데이터의 타입)은 서로 다릅니다. 하지만 위와 같은 경우(그리고 포인터를 사용하는 대부분의 상황)에서는 C의 느슨한 포인터 타입끼리의 형변환 때문에 아무 문제없이 사용할 수 있는 것입니다.

char buf[4][16];

buf의 주소를 1000이라 가정하면...

배열 이름(혹은 그 결과값이 배열을 나타내는 수식. 여기서는 buf가 이차원 배열이므로 *buf, buf[0] 또한 배열을 나타내는 수식이라 할 수 있다)은 세가지 예외상황을 제외하고 항상 그 자신의 첫번째 원소 (여기서는 그 자신의 array of char[16]형 원소)를 가리키는 주소값(여기서 그 타입은 pointer to array of char[16])으로 변환됩니다. 아래의 경우에는, 이 규칙이 두번이 적용되어 array of char[16] -> pointer to char 의 과정을 거쳐 타입이 결정되게 됩니다.

buf[1] -> *(buf + 1) -> 주소값은 1016, 타입은 pointer to char

그러나 배열 이름이 &연산자의 피연산자, sizeof 연산자의 피연산자, 문자형 배열의 초기화에 쓰이는 문자열 상수와 같은 곳에 쓰였을 경우에는 이러한 규칙이 적용되지 않습니다.

&buf[1] -> &*(buf + 1) -> buf + 1 -> 주소값은 1016, 타입은 pointer to array of char[16]

참고로, buf와 buf + 1의 차가 1이 아니라 16이 되는 이유는, 위에서 말한 규칙에 의해 buf + 1이라는 수식에서 buf가 타입이 pointer to array of char[16] 인 주소값이 되기 때문입니다. 포인터 주소값과 정수형의 덧셈에서는 그 결과값이 '주소값 + 정수값'이 아니라 '주소값 + (포인터가 가리키는 데이터형의 크기) * 정수값'이 됩니다.

둘 중에 어느 쪽이 맞느냐고 묻는다면 저는 타입이 pointer to char인 buf[1]을 선택하겠습니다. 그러나 위의 상황에서는 사실 둘다 별 문제 없습니다.

댓글 달기

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