2012-12-08 1 views
2

strcpy 기능에 문제가 있습니다. 이 간단한 코드 (아래)의 핵심은 배열에서 포인터 배열로 문자열을 복사하는 것입니다.C strcpy = 처리되지 않은 예외 : 액세스 위반 작성 위치 0x00000000

Unhandled exception: Access violation writing location 0x00000000. 

이유 :

char string[20] = "ABCDEFGH\0"; 
char * array_of_pointers[20]; 

// now I want to copy string to the first available slot; 

strcpy(array_of_pointers[0],string); 

그런 다음 strcpy를 나에게 오류가 발생합니다? 나는이 문제가 아마 간단하다는 것을 알고 있지만, 나는 실마리가 없다.

답변

5

대상 버퍼가 초기화되지 않았습니다. array_of_pointers[0]은 포인터 (이 경우 액세스 위반의 오류 정보를 기반으로 함)가 주소 0을 가리키는 포인터입니다. 포인터를 초기화해야합니다. 가능 :

array_of_pointers은 20 개의 포인터 배열입니다. 이와 같이 정의 된 배열의 각 항목은 사용하기 전에 초기화해야합니다. malloc (또는 아마도 strdup)을 사용하여 메모리를 할당하는 경우 free을 사용하여 메모리를 해제하십시오.

+0

나는 그것을 할 수 없다. array_of_pointers [0] = malloc (strlen (string) + 1); Visual에서 "void *"유형의 값을 "char *"유형의 엔티티에 할당 할 수 없습니다 – krzakov

+0

그런 다음 C++ 파일로 컴파일하는 것처럼 들립니다. 이 경우, 그것을 캐스팅해야합니다 :'array_of_pointers [0] = (char *) malloc (...)' –

+0

Ok. 케이스가 흠뻑 젖었다. 정의가 초기화를 제공한다고 생각했습니다. – krzakov

1

당신은 array_of_pointers를 초기화해야합니다

array_of_pointers[0] = malloc(strlen(string)+1); 

또는 최고 :

array_of_pointers[0] = strdup(string); 
+0

나는 그것을 할 수 없다. array_of_pointers [0] = malloc (strlen (string) + 1); Visual에서는 "void *"유형의 값을 "char *"유형의 엔터티에 할당 할 수 없습니다. – krzakov

+0

strdup 솔루션이 컴파일됩니다. 그러나 malloc을 직접 호출하려면 malloc 반환 값을 (char *)로 변환해야합니다. 또한 스택 공간이 아닌 힙 공간을 사용하고 있으므로 힙 공간 오류가 없는지 확인하십시오. – AlgebraWinter