2013-10-21 1 views
0

내가 스택 할당 배열 (포인터 만 스택 프레임 내에서 호출에 전달한다)에 대한 포인터를 초기화하기 위해 노력하고있어 ... 내가 여기서 뭔가를 이해 해요배열에 대한 포인터에 memset을 호출 하시겠습니까?

bool (*lookup)[100]; 
memset(lookup, 0, 100 * sizeof(*lookup)); 

생각하지 않습니다 . memset은 배열을 0으로 초기화하기위한 것입니다.

이전 코드는 segfault를 발생 시키며 포인터가 아닌 memset입니까?

memset(lookup, 0, 100 * sizeof(*lookup)); 

이렇게함으로써

+1

이 어디에 "* 스택 할당 배열 * "? – alk

+0

'memset'는 포인터가 아주 좋아요. 포인터 *,'memset (& loopkup, 0, sizeof (lookup));에 의해 점유 된 메모리에서 호출한다면 * 코드는 유효 할 것이다 (다소 무의미 함). 작성된 것처럼 초기화되지 않은 포인터 변수에서 가져온 * indeterminate * 주소를 사용하여 호출합니다. 따라서 정의되지 않은 동작입니다. – WhozCraig

답변

4

당신은하지만, 메모리 포인터를에 lookup 점 "포인터를 초기화"하지 않습니다.

memset()을 호출하기 전에 포인터가 유효한 메모리를 가리 키지 않았기 때문에 임의의 메모리에 쓰면 정의되지 않은 동작이 발생하여 프로그램이 충돌합니다.

유효한 메모리를 얻는 방법은 여러 가지가 있습니다.

bool lookup_instance[100] = {0}; 
bool (*lookup)[100] = &lookup_instance; 
/* No need to memset it to 0s as this had been done by ... = {0} already. */ 

또는과 같이 스스로를 얻을 :

과 같이 스택에서 가져 오기

bool (*lookup)[100] = malloc(sizeof(*lookup)); 
if (lookup) 
    memset(lookup, 0, sizeof(*lookup)); 
else 
    perror("malloc() failed"); 

가장 짧은 솔루션은 다음과 같습니다

bool (*lookup)[100] = calloc(1, sizeof(*lookup)); 
if (!lookup) 
    perror("calloc() failed"); 
/* No need to memset it to 0s as this had been done by calloc() already. */ 
+0

그러나'size * '는 이미 멤버가 아닌 배열의 크기를 얻기 때문에'100 *'은 의미가 없습니다. – rodrigo

+0

@rodrigo : Huu .. 내가 쓴거야? 어쨌든 임시 뇌 덫 일 것임에 틀림 없다! 수정되었습니다! – alk

+0

@rodrigo : 아, 알겠습니다. 나는 그것을 OP에서 복사했습니다. 젠장 복사 & 붙여 넣기 프로그래밍 ... : – alk