2011-06-13 2 views
4

여기 및 다른 장소에서 여러 가지 질문을 검토했지만 액세스 위반 오류에 대해 설명 할 수 없습니다. "액세스 위반 작성 위치 0x00000000"은 NULL 포인터에 해당합니다. 나는 int 포인터를 선언했으며 나중에 그 위치에 값을 설정하려고합니다. 포인터를 선언 할 때 메모리 공간을 할당하면 안됩니까? 이것이 noobish라면 나에게 용서해라. 그러나 나는 Java/AS3 사람의 안에서 매우 많다. 여기 C++ 액세스 위반 작성 위치 0x0 ... 설정 int *

int* input; 
char* userInput[1]; 
int* output; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    while(1) 
    { 
     srand(time(0)); 
     *input = (int)(rand() % 10); 

그것은 마지막 줄에 중단 ... 내 코드의 일부입니다.

답변

10

메모리는 포인터에 대해 으로 할당되지만 포인터 자체는 여전히 아무 곳이나 가리 키지 않습니다. new을 사용하여 포인터가 가리키는 메모리를 할당하고 나중에 delete으로 해제하십시오.

2

포인터를 선언했지만 포인터가 가리키는 메모리를 할당하지 않았습니다. 전역 포인터 변수는 0으로 초기화되므로 스택에서는 정의되지 않은 동작을 얻을 수 있습니다.

do input = new int 역 참조하기 전에.

+1

전역 변수는 기본적으로 초기화됩니다. 그건 원시 타입에 대해서는 0으로 설정되지만, 생성자 등을 호출하면 더 복잡한 일이 발생합니다 ....

+0

널 포인터를 역 참조하는 것은 야생 포인터보다 감지하기 쉽지만 * 정의되지 않은 동작입니다. . –

+0

@Billy : 정적 수명이있는 변수는 실행이 시작되기 전에 먼저 0으로 초기화됩니다. 그 후 생성자가 실행됩니다. –

1

번호 int* input;은 정수를 저장하는 데 필요한 실제 공간이 아니라 int에 대한 포인터 만 선언합니다.

1

번호 메모리 공간이 포인터에 할당되지 않습니다. 당신은 자신을 할당해야합니다. (C++을 사용한다면 거의 항상 원시 포인터 대신 원시 포인터를 사용해야합니다.)

1

포인터 자체의 메모리는 예약되어 있지만 (주소를 보유 할만큼 충분) 메모리가 아닙니다. 포인터가 가리키는 포인터.

Java 배경을 사용하면 NullReferenceException과 유사하게 나타납니다.

0

정말로 포인터가 필요합니까? 당신은 그냥 int S와 문자열이 필요한 경우에는 직접 할당 할 수 있습니다 :

는 "나는 포인터를 선언 할 때 메모리 공간이 할당되지해야"
int input; 
int output; 
std::string userInput; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    while(1) 
    { 
     srand(time(0)); 
     input = rand() % 10; 
0

이 - 당신이 사용하는 경우 힙에 메모리 만 할당 새로운 키워드 예를 들어,

int *ptr //creates a pointer variable on the stack 
ptr = new int(5); //allocates space in heap and stores 5 in that space 

희망이 도움이 될 것입니다.