이런 질문에 대한 구체적인 답변을 찾는 것이 어려워 보이지만 이것이 생각하지 않는 방식으로 생각한다고 설명합니다. , 그리고 어쩌면 누군가가 내가 틀린 곳을 말해 줄 수 있습니다.C++ 루프, 범위 및 스택
스택에있는 main에 10 크기의 정수 배열을 만듭니다. 그런 다음 for 루프를 사용하여 배열에 정수 0-9를로드합니다. for 루프가 끝나면 스택 포인터는 arr1을 초기화 한 후 스택 포인터를 반환하지만 여전히 해당 값이 메모리에 존재하며 배열은 계속 포인터를 가리 킵니다.
그런 다음 다른 for 루프를 사용하여 첫 번째 for 루프에서 만든 값을 덮어 쓰게 스택을 넘치게하고 arr1에서 내 값에 액세스 할 때 5000 값이있는 정수를 가리켜 야합니다
배열을 인쇄해도 여전히 숫자 0-9가 인쇄됩니다. 왜이게 효과가 있니? 루프에서 선언 된 데이터가 범위를 벗어날 때 스택에서 꺼내 졌다고 생각했습니다. 감사합니다
int main(void)
{
int arr1[10];
for(int i = 0; i < 10; i++)
arr1[i] = i;
for(int i = 0; i < 500; i++)
int a = 5000;
for(int i = 0; i < 10; i++)
cout << arr1[i] << endl;
system("PAUSE");
return 0;
}
C++의 배열은 해당 데이터 형식의 값 시퀀스가 순서대로 존재하는 메모리의 위치에 대한 포인터 일뿐입니다. 따라서 그 값이 for 루프에서 생성되고 해당 루프가 범위를 벗어나면 배열이 가리키는 값이 스택에서 팝 아웃되지 않았습니까? 감사합니다 –
@ JohnSavage : 귀하의 인상이 올바르지 않습니다. C++의 배열은 시퀀스가 존재하는 메모리 내의 위치에 대한 포인터가 아니며, * 시퀀스입니다. 값은'for' 루프에서 생성되지 않으며 배열이 생성 될 때 생성됩니다 (이 경우 초기화되지 않아 자체 위험을 초래합니다). 그것들은'for' 루프에서 수정됩니다. –
@ JohnSavage 배열 변수 *가 포인터처럼 작동한다는 점에서 옳습니다 (쉽게 포인터로 변환 될 수 있습니다). 그러나 정적 배열 (예에서와 같이)을 사용하면 선언 할 때 전체 배열이 실제로 * * (스택에 추가됨)로 생성됩니다. 루프 안의 코드는 배열의 값을 지정 (즉 변경)하는 것입니다. –