char a[8] = "hello!!"; // a 배열 null 로 초기화 하기 1 for(int i=0; i < 8; i++) a[i] = '\0'; // 2 *(long long *)&a = 0;
처음에 a 배열에 널값들을 넣어준 뒤에 *(long long *)&a = 0; 이 코드가 뭘 의미하는지 잘 모르겠습니다. 포인터 이해하기 너무 어렵네요
먼저 기호의 우선수위대로 해석 하면 그나마 이해하는대 편합니다.
1. () 가 * 보다 우선이며 &가 가장 우선순의가 낮습니다. 2. 그러면 ()먼저 해석 하는데 long long 타입 주소에다가 3. ()앞에 *가있으니, long long 형식이 가리키는 곳에 4. &a는 a의 주소값을 말하는 것이니 5. long long 타입의 가리키는 값에 a의 주소값을 대입하여 6. 결국은 a의 메모리 주소의 값에 0을 넣는다는 의미입니다.
더 햇갈리네요.
*는 변수가 가르키는 곳의 값. &는 변수의 주소값.
누가 좀더 설명좀 해주시기 바랍니다.
long long 이 가르키는 곳에 a 메모리 주소값을 넣고 그곳에 0을 집어넣는 것인가요?
a를 null로 초기화하는 방법을 두 가지 보여주는 코드입니다. 질문하신 부분은 for loop 을 사용하지 않고 a를 null로 초기화하는 방법입니다.
힌트 1. long long 은 8 byte 정수 타입입니다. 즉 a와 크기가 같지요. 그리고 정수 0은 모든 비트가 0입니다.
힌트 2. *(long long *)&a = 0 은 *((long long *)(&a)) = 0 와 같은 뜻입니다. 괄호에 신경써서 의미를 생각해보세요.
주의 1. char 배열을 초기화하는 방법으로 별로 권장할만한 방법은 아닙니다. 이해는 하시되 실제로 사용하지는 마세요.
8 바이트 전부를 0x00 값으로 바꾸는 평범한(1) 예와 좋지 않은(2) 예를 보여주고 있습니다.
두번째 코드는 address alignment 에 대한 고려가 없어 이식성이 전혀 없으며, 심지어 버그도 있습니다.
alignment와는 관계 없어보입니다만. alignment에서 어떤 문제가 생기지요?
https://kldp.org/comment/615236#comment-615236
그렇네요. new 로 얻어진 char array가 임의의 타입에 대한 raw memory로 사용될 수 있는 것과 헷갈렸네요. local char array 와는 다르지요.
특정 CPU에서 a의 주소가 4 의 배수에 할당되고 long long의 길이가 8byte 면 alignment 문제가 발생할 수 있습니다.
---http://coolengineer.com
텍스트 포맷에 대한 자세한 정보
<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]
먼저 기호의 우선수위대로 해석 하면 그나마 이해하는대
먼저 기호의 우선수위대로 해석 하면 그나마 이해하는대 편합니다.
1. () 가 * 보다 우선이며 &가 가장 우선순의가 낮습니다.
2. 그러면 ()먼저 해석 하는데 long long 타입 주소에다가
3. ()앞에 *가있으니, long long 형식이 가리키는 곳에
4. &a는 a의 주소값을 말하는 것이니
5. long long 타입의 가리키는 값에 a의 주소값을 대입하여
6. 결국은 a의 메모리 주소의 값에 0을 넣는다는 의미입니다.
더 햇갈리네요.
*는 변수가 가르키는 곳의 값.
&는 변수의 주소값.
누가 좀더 설명좀 해주시기 바랍니다.
long long 이 가르키는 곳에 a 메모리 주소
long long 이 가르키는 곳에 a 메모리 주소값을 넣고 그곳에 0을 집어넣는 것인가요?
a를 null로 초기화하는 방법을 두 가지 보여주는
a를 null로 초기화하는 방법을 두 가지 보여주는 코드입니다. 질문하신 부분은 for loop 을 사용하지 않고 a를 null로 초기화하는 방법입니다.
힌트 1. long long 은 8 byte 정수 타입입니다. 즉 a와 크기가 같지요. 그리고 정수 0은 모든 비트가 0입니다.
힌트 2. *(long long *)&a = 0 은 *((long long *)(&a)) = 0 와 같은 뜻입니다. 괄호에 신경써서 의미를 생각해보세요.
주의 1. char 배열을 초기화하는 방법으로 별로 권장할만한 방법은 아닙니다. 이해는 하시되 실제로 사용하지는 마세요.
8 바이트 전부를 0x00 값으로 바꾸는 평범한(1)
8 바이트 전부를 0x00 값으로 바꾸는 평범한(1) 예와 좋지 않은(2) 예를 보여주고 있습니다.
두번째 코드는 address alignment 에 대한 고려가 없어 이식성이 전혀 없으며, 심지어 버그도 있습니다.
alignment와는 관계 없어보입니다만.
alignment와는 관계 없어보입니다만. alignment에서 어떤 문제가 생기지요?
https://kldp.org/comment
https://kldp.org/comment/615236#comment-615236
그렇네요. new 로 얻어진 char array가
그렇네요. new 로 얻어진 char array가 임의의 타입에 대한 raw memory로 사용될 수 있는 것과 헷갈렸네요. local char array 와는 다르지요.
특정 CPU에서 a의 주소가 4 의 배수에 할당되고
특정 CPU에서 a의 주소가 4 의 배수에 할당되고 long long의 길이가 8byte 면 alignment 문제가 발생할 수 있습니다.
---
http://coolengineer.com
댓글 달기