2012-06-16 2 views
0

우분투 12.04와 Qt 크리에이터 2.4.1을 사용하고 있습니다. 기본적으로 내 C 코드는 GCC입니다.C는 언제 변수를 생성합니까?

내 프로그램 (Qt Creator (uses GDB))을 디버깅하고 있으며 프로그램의 나중 단계에서 많은 변수를 볼 수 있습니다. 프로그램 초기에 모든 변수를 보는 것이 정상입니까? 다시 말해 디버그 옵션 (-g) 때문에 프로그램의 초기 단계에서 변수를 볼 수 있습니까? 예를 들어, I 코드로 ''단계와 a busy cat http://i48.tinypic.com/1z48ls6.png

char[1000] mesg;int main() 그러나 129 번째 라인에서 실행되는 첫 번째 단계에서 중지 I 이미 그 메모리 어드레스를 알 수있다. 또는 int tem_hopt_dist=0;이 230 행에 있지만 '3'값이 이미 있습니다.

+2

정적으로 정의 된 변수가 프로그램의 데이터 "섹션"에 컴파일되므로 해당 루틴/기능의 범위에있는 경우 해당 지점에서 볼 수 있습니다. 데이터 섹션에 정적으로있는 항목은 해당 루틴의 항목에 할당 될 수 있습니다. – trumpetlicks

답변

2

예, 정상입니다. 디버거는 언어의 모든 범위 지정 의미를 이해하지 못하고 범위 밖일 때라도 모든 변수가 최종 메모리 위치에 초기화 된 것처럼 데이터를 표시합니다.

일부 디버거는 다른 디버거보다 좋습니다. 이것은 예를 들어 i이라고하는 별도의 색인 변수를 사용하는 습관에 있고 디버거가 변수를 구별하지 못하는 경우와 같이 자주 발생하는 자극입니다.

4

static 키워드와 같은 것은 아니지만 일반적으로 static이 선언 된 변수에는 정적 지속 기간이 있지만 변수는 실행 모델에서 main이 호출 될 때까지 "생성"됩니다. "자동 지속 시간"(많은 사람들이 호출하는 "스택 상")을 가진 변수는 범위가 입력 될 때 생성됩니다. malloc을 통해 할당 된 변수는 free (또는 공백이 realloc 등으로 감소 될 때까지)까지 계속됩니다.

위의 키 - 데려가는 것이 아니라 "하여이 포인트" "에서이 점을 을 만들어"하지 않습니다. 컴파일러는 더 효율적이라면 이전에 자유롭게 할 수 있습니다. 블록 범위, 자동 지속 시간 변수의 경우 일반적으로 컴파일러가 단일 "빼기"명령어 (스택 포인터에서 "빼기 상수")를 사용하여 수행 할 수있는 하나의 큰 엔트리 포인트 스택 할당으로 전체를 일괄 적으로 싼 것이 가장 일반적입니다 현대 기계. 공간을 해제하는 것은 완전히 무료입니다 ("함수에서 반환") 또는 다시 한 명령 ("스택 포인터에 상수 추가")이 필요합니다.

C99의 가변 길이 어레이 (VLA)는 약간 복잡합니다. VLA는 종종 둘러싸는 블록이 입력 될 때마다 할당되어야하고, 블록이 종료 될 때마다 해제되어야합니다. 다시 말하지만, 이것은 일반적으로 상당히 저렴합니다 (하나는 VLA를 만들기위한 스택 포인터에서 빼기, 하나는 VLA를 없애기 위해 추가).하지만 분명히 블록 당 2 개의 명령어가 블록 당 0 개의 명령어보다 비쌉니다. 이것은 또한 약간의 컴파일 타임 최적화를 방해합니다.

비표준 alloca 함수를 사용하는 경우 일반적으로 스택 포인터에서 뺄셈을 통해 구현되며, VLA에서는 "잘 재생"되지 않을 수 있습니다. 그런 종류의 빼기는 컴파일러에 함수 자체가 시작되기 바로 전에 "스택 포인터에서 빼기"를 한 번 정확하게 수행했습니다.