2014-10-21 7 views
0

이것은 중복 일지 모르지만 정확한 상황을 다루는 다른 질문을 찾지 못했습니다 (아직).int의 주소를받지 않고 char []에 int를 memcpy 할 수없는 이유는 무엇입니까?

는 여기에 내가 할 노력하고있어 무엇 :

int n = 12; 
char s[sizeof(n)]; 
memcpy(s, (char *)n, sizeof(n)); 
printf("%d", s); 

을 기본적으로,이 n의 주소를 얻을 필요없이 sn를 복사 할. 이걸 실행하면 세그먼트 오류가 발생합니다. 그러나 작동합니다 :

printf("%d", (char *)n); 

그래서 문제가 memcpy 호출에 있음을 알고 있습니다. 왜 내가 char []에 int를 memcpy 할 수 없는가?

+0

'memcpy'는 복사 할 데이터를 찾을 수있는 * 주소 *를 필요로합니다. – juanchopanza

+0

주소가 왜 문제가됩니까? –

+0

라이브러리 함수를 사용할 때 함수의 서명을 준수해야하기 때문에 그렇게 할 수 없습니다. –

답변

2

당신이하려고하는 것은 코드 상태가 아니기 때문에 세분화 오류가 발생합니다.

int n = 12; 
char s[sizeof(n)]; 
memcpy(s, (char *)n, sizeof(n)); 

당신

말을를 원 :

"sn의 값을 나타내는 sizeof(int) 바이트를 복사합니다."

그러나 memcpy()은 값이 아닌 메모리 개체를 복사하는 것입니다. 객체 은 주어진 주소에이고, 은 주어진 값인을 포함합니다. n을 취하면 &n에 주소를 부여하여 값을 제공합니다.

그리고 구조 (char *)nchar주소n을 해석 할 수있는 컴파일러, 그래서 말은 무엇 당신을 알려줍니다

"에서 sizeof(int) 바이트 복사를 주소는 ns에 포함되어 있습니다. "

n = 12 때문에, 당신은 (따라서는 segfault)에서 읽을 수있는 법적 주소 가능성이없는 주소 0x00000012 ...에서 읽고있다.

int n = 12; 
char s[sizeof(n)]; 
memcpy(s, (char *)&n, sizeof(n)); 

"주소에서 sizeof(int) 바이트 복사 : char *로합니다 ( 대신) 것을을 주조하기 전에 n의 주소를 복용함으로써

, 당신의 문은 의도와 일치 ns "으로 변경하십시오.

1

s의 주소는이 컨텍스트의 배열 이름이 첫 번째 요소의 주소로 평가되므로 사용하지 않아도됩니다.정수 n은 배열이 아니므로 적용되지 않습니다. 따라서 주소를 가져 가야합니다.

물론 당신은이 문제를 얻기 위해, 너무 int 배열을 사용할 수 있지만, 그것은 매우 바보와 일반적으로 아주 나쁜 아이디어 : n 지금 &n[0]로 평가되므로

int n[1]; 
char s[sizeof n]; 
memcpy(s, n, sizeof n); 

이 주소 즉, 작동 배열의 첫 번째 (그리고 유일한!) 요소의.

sizeof은 기능이 아니므로이 용도로 사용하려면 괄호가 필요하지 않습니다.