memset에 좋은 방법은?
글쓴이: dreamer / 작성시간: 화, 2004/11/23 - 2:01오후
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번의 경우로 초기화를 하는데.. 좋은 방법이 있으면 추천해주세요..
Forums:
2번처럼 하기도 합니다.char buf[width][height]
2번처럼 하기도 합니다.
char buf[width][height];
memset(buf, 0, sizeof(buf));
----------------------------
May the F/OSS be with you..
가장 좋다기 보다...
저도 위에분처럼 2번을 즐겨 사용합니다.
다른 이유는 없구요... 편해서요~
http://www.korone.net QT 커뮤니티 사이트
Re: memset에 좋은 방법은?
2번 가능합니다
3번 같은 경우는 전부가 아닌 일부만 초기화 하면 나머지는 0으로 초기화 하는걸로 알고 있습니다
음 배열이 연속으로 잡히죠.. 기초를 확실히 해야 하는데.. ^^2번
음 배열이 연속으로 잡히죠.. 기초를 확실히 해야 하는데.. ^^
2번이 젤 쉽고 깔끔하겟네요..
또 하난 궁금한게 생겻는데,
memset(&buf[1], 0xff, 16);
하고
memset(buf[1], 0xff, 16);
은 같은 가요?
실제로 컴파일 하고 돌려보면 동작은 같이 하는데...
[quote="dreamer"]음 배열이 연속으로 잡히죠.. 기초를 확실
char buf[4][16]; 과 같이 이차원 배열일 경우에
buf[1] 과 &buf[1]은 모두 buf[1][0]의 주소를 가리키므로
같은 값입니다.
&를 붙이는 편이 문맥상 좀더 좋아보입니다만.. 스타일이겠죠.
gcc나 iso c99를 쓰신다면 3번 비슷하게도 가능합니다.[c
gcc나 iso c99를 쓰신다면 3번 비슷하게도 가능합니다.
오늘 우리는 동지를 땅에 묻었습니다. 그러나 땅은 이제 우리들의 것입니다.
아직도 우리의 적은 강합니다. 그러나 우리는 그들보다 많습니다.
항상 많을 것입니다.
저 같은 경우는 보통 배열크기 같은 것은 define으로 빼는 편이라
저 같은 경우는 보통 배열크기 같은 것은 define으로 빼는 편이라
#define AA 10
#define BB 20
...
memset(buf, 0xff, AA*BB); 이런 스타일을 씁니다만 --;
나는 생각하는 갈대다?
[quote="dreamer"]또 하난 궁금한게 생겻는데, mem
보통 포인터를 쓸 때는 그것이 가리키고 있는 주소값만을 신경쓰는 경우가 많은데, 주소값 외에도 포인터가 가리키고 있는 데이터의 타입(혹은 포인터가 가리키고 있는 데이터의 크기)에도 신경을 쓰는 것이 좋습니다. &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]을 선택하겠습니다. 그러나 위의 상황에서는 사실 둘다 별 문제 없습니다.
댓글 달기