2013-03-17 3 views
0

정적 배열의 요소를 설정해야 할 때 memset의 첫 번째 매개 변수로 전달할 항목에 대해 다소 혼란 스럽습니다. 나는 조사를 해왔지만 내가 가지고있는 몇 가지 구체적인 질문에 대한 답을 찾을 수 없었다. 나는이 두 호출이 유효한지 알과 같은 효과를 한정적 배열의 memset

char arr[10]; 

:

memset(arr, 0, 10); 
memset(&arr, 0, 10); 

내 구체적인 질문은 다음과 같이

나는 배열 선언 한 경우

1- 왜 그들이 arr에 동일한 효과를 갖는가?

2 이러한 호출 간에는 어떤 차이가 있습니까?

3 올바른 것으로 간주되는 설정은 무엇입니까?

감사합니다.

+5

올바른 방법 : '문자의 편곡 [10] = {};' – ipc

답변

4

저장 기간은 아무 관계가 없습니다. 배열은 배열입니다. 이 식은 :

&arr 

가 생산하는 char (*)[10], 즉 10 개 char 요소들의 어레이에 대한 포인터. 그러나, 그렇게 arr 같은 함수에 전달된다

memset(arr, 0, 10); 

는 첫 번째 요소에 대한 포인터 저하, 즉 char*. 이것들은 같은 것이 아닙니다.은 "올바른"(관용) 호출은 다음과 같습니다 memset에 전달하고 unsigned char*으로 기능을 해석 할 때

memset(arr, 0, 10); 

그러나이 경우 그들은 모두 void*로 변환됩니다. 둘 다 같은 장소를 가리 키므로 동일한 결과를 산출합니다.

그러나, 실제 각 유형을 처리 할 때 (즉, 아니 void*)의 배열에 대한 포인터 하지 어레이의 첫 번째 요소에 대한 포인터와 동일하다는 것을 인식하는 것이 중요하다.

예를 들어 char (*)[10]을 증가 시키면 sizeof(char[10]) 바이트가 증가하고 char*을 증가 시키면 한 바이트 만 증가합니다.

+0

아! 의미가있어, 고마워! – santi

+1

하나의 수정 :''char * ''로 해석되고''unsigned char * '로 변경되어야합니다. –

+0

@JesseGood : 네, 잘 부탁드립니다. '; –

0

1- 왜 그들은 arr에 동일한 효과가 있습니까?

둘 다 배열 시작 부분의 주소 인 동일한 값을 포함합니다.

2 이러한 호출 간에는 어떤 차이가 있습니까?

arr는 (만약 함수 배열의 이름을 전달할 때 변환이 발생 함)과 &arr배열 차르, 즉 char (*)[] 포인터이다 char*, 즉을는 char 포인터로 붕괴.

3 올바른 것으로 간주되는 설정은 무엇입니까?

나는 arr을 사용할 것입니다. memset은 모두 void*을 허용하므로 두 가지 이유가 있습니다.

또한 char arr[10] = {};을 사용하여 배열을 0으로 초기화 할 수 있습니다.

+2

주의 -'arr'이 **하지 ** A A 문자 포인터하지만 하나에 붕괴 할 수 있습니다. –

+0

@DrewDormann : 감사합니다. 빠르게 입력 할 때 정확하기가 어렵습니다 (변경된 문구). –

2

왜 그들은 arr에 동일한 효과가 있습니까? 이 통화들 사이에 다른 점은 무엇입니까?

배열의 주소가 첫 번째 요소의 주소와 같기 때문에 (배열은 함수에 전달 될 때 첫 번째 요소에 대한 포인터로 사라집니다), 다른 형식을 사용한다는 것입니다. arrchar[10] 유형이며, 이는 함수에 전달 될 때 char *으로 붕괴합니다. 반대로 &arr 유형은 char (*)[10]이며 함수 인수로 전달하면 변경되지 않습니다.

어느 것이 올바른 것으로 간주 될까요?

기능이 특정 유형을 예상하지 않는 한, i. 이자형. 그것은 void *를 받아 들인다, 어느 쪽이든 좋다. 그러나 호출 된 함수가 유형 중 하나가 지정 될 것으로 예상되면 다른 프로그램은 사용되지 않아야합니다. 그러면 프로그램이 조작되지 않아 정의되지 않은 동작이 호출됩니다. 제로로 모든 설정

+0

그것은'memset 함수 (편곡, 0, 10)를 사용하는 것이 좋습니다 아닌가? 어레이 선언 숯을 도착 * = 새 문자 [10] ''어떤 이유로 변경된다면 그것은 유효. – user502144

+1

user502144 @ 우리는 "이 변경"사건에 대해 이야기하지 않고 있습니다. 두 사람이 유효한 경우 또는, 더 정확하게, 나는 마지막 부분에서 언급했다. –