2009-12-05 4 views
0

나는이 C 코드할당 순서가

#define STACKSIZE  65536  

      char d[STACKSIZE]; 
      if (((int) &d[STACKSIZE-1]) - ((int) &d[0]) + 1 != STACKSIZE) { 
       Printf ("Stack space reservation failed\n"); 
       Exit(); 
      } 

      printf("Allocated from %d to %d so for %d bytes\n", &d, d+sizeof(d), sizeof(d)); 

      auto int a = 3; 
      printf("Now the stack pointer is on %d\n",&a); 

을 실행하는거야 그리고 내가 65536 바이트 위해 이렇게 -4197296하는 -4262832에서 할당 된 출력 로 얻을 것은 이제 스택 포인터는 -4262836

이것은 "a"변수가 배열 후에 스택에 놓이게됨을 의미합니다. 그러나 가변 길이 배열 (런타임에 길이가 설정된 배열)을 사용하면 반대의 동작이 발생합니다. 배열 앞에 배열을 넣습니다.

는 코드 (이 같지만 배열의 크기는 런타임에 걸렸고된다)

#define STACKSIZE  65536  

      int i = 1; 
      char d[i*STACKSIZE]; 
      if (((int) &d[STACKSIZE-1]) - ((int) &d[0]) + 1 != STACKSIZE) { 
       Printf ("Stack space reservation failed\n"); 
       Exit(); 
      } 

      printf("Allocated from %d to %d so for %d bytes\n", &d, d+sizeof(d), sizeof(d)); 

      auto int a = 3; 
      printf("Now the stack pointer is on %d\n",&a); 

이 65536 바이트 정도로 -4197320하는 -4262856에서 할당 출력

인 이제 스택 포인터가 켜짐 -4197312

그래서 문제가 무엇입니까? 어떻게 해결할 수 있습니까 (가변 길이 배열을 사용하고 그 뒤에 스택에 변수 넣기).

감사합니다.

+0

코드를 포맷하고 적절한 태그를 넣어 언어를 나타낼 수 있습니까? 그것이 C 인 경우 대문자 P가있는 Printf는 없습니다. 그런 다음 다른 사람들이 읽을 수 있도록 코드를 수정하십시오. – t0mm13b

답변

1

수 없습니다. 그리고 변수가 어디에 있는지 신경 쓰지 말아야합니다. 컴파일러는 어쨌든 그것들을 entierly 최적화 할 수 있습니다.

비록 시스템 의존도는 높지만 컴파일러는 일반적으로 배열 크기를 늘리기 위해 스택을 늘리는 것부터 다르기 때문에 일반적으로 가변 크기의 배열을 다른 모든 항목 다음에 할당합니다. 컴파일러가 해당 영역 다음에 변수를 넣으면 동적 크기 배열의 크기를 통해 간접적으로 액세스해야합니다.

관련 문제