2013-08-12 3 views
1

, 나는 다음과 같은 실행스택 변수에 메모리를 어떻게 할당합니까? VS (자료)에

int main(void) 
{ 
    char b[] = "123"; 
    char a[] = "1234567"; 
    printf("%x %x\n", b,a); 
    return 0; 
} 

가 나는 것을 볼 수 있습니다, a의 MEM 주소는 B + 3 (문자열의 길이)입니다. 이는 메모리가 틈없이 할당되었음을 보여줍니다. 그리고 이것은 최소한의 기억이 사용된다는 것을 보장합니다. 그래서 저는 이제 모든 컴파일러가 그렇게 할 것이라고 생각합니다. 여기이 추측을 확인하고 싶습니다. 누군가 제게 좀 더 공식적인 증거를 주거나 추측이 우연의 일치라고 말 할 수 있습니까?

+2

실제로 어드레스 + 4 ㄱ 출력한다. 마지막에 널 종결 자. –

+0

그들 사이에'short'와'int' 변수를 추가하여 이론이 유효한지 확인할 수 있습니다. – nos

+0

예, hitesh, 16 진수 계산에 잘못했습니다. 감사. 그리고 더 많은 테스트를하고 있습니다. –

답변

2

아니요, 항상 완벽한 데이터 패킹이 보장되는 것은 아닙니다. 예를 들어

은, 내가 컴파일 g의 ++에서이 코드를 runned, 그 차이는 당신이 here에 대한 자세한 내용을보실 수 있습니다 8. ​​

입니다.

TL; DR : 하나의 흥미로운 : 컴파일러는

UPD (그들을 위해이 같은 주소와 함께 작동하도록 쉽게) 프로세서를 돕기 위해 단지 몇 가지 상수 (항상 기계 워드 길이)로 나눌 주소에 메모리의 개체를 정렬 할 수 있습니다 예에 대한 정렬 : 나를 위해

#include <iostream> 
using namespace std; 

struct A 
{ 
    int a; 
    char b; 
    int c; 
    char d; 
}; 

struct B 
{ 
    int a; 
    int c; 
    char b; 
    char d; 
}; 

int main() 
{ 
    cout << sizeof(A) << " " << sizeof(B) << "\n"; 
} 

, 그것은의

16 12 
+0

정보를 제공해 주셔서 감사합니다. –

+0

@Andrey Komarov : 스택은 정렬 및 패딩과 관련하여 객체처럼 작동합니까? – user2672165

+0

@ user2672165 스택 구현은 컴파일러에 따라 다릅니다. 그러나 동일한 유형의 모든 객체는 객체의 시작부터 각 필드의 오프셋을 보존하기 위해 비슷하게 배치됩니다. 따라서, 스택에'A '타입이있을 때마다'(intptr_t) & a.c- (intptr_t) & a'는 같을 것입니다. –

2

각 변수에 대해 어떤 주소가 선택되는지는 보장 할 수 없습니다. 서로 다른 프로세서는 예를 들어 변수 정렬에 대해 서로 다른 요구 사항 또는 기본 설정을 가질 수 있습니다.

또한 예제에서 주소 사이에 최소한 4 바이트가 있어야합니다. "123"에는 4 바이트가 필요합니다. 추가 바이트는 널 종결자가됩니다.

+0

예, 두 주소 사이에 4 바이트입니다. 글쎄, 당신은 프로세서를 언급했는데, 이것은 컴파일러에 특정한 것이 아닌가? –

+0

@RobertBean 네, 컴파일러는 여기에서 자신의 일을 자유롭게 할 수 있습니다. 다른 프로세서에 대한 언급은 변수가 항상 당신이 암시한다고 생각하는 방식으로 포장되지는 않는 장소의 예를 의도 한 것입니다. – simonc

1

[] 및 b []를 선언하고/또는 b의 길이를 늘리는 순서를 바꿔보십시오.

저장 용량 할당 방식에 대한 매우 큰 가정을하고 있습니다. 컴파일러에 따라 문자열 리터럴은 스택에없는 리터럴 풀에 저장 될 수 있습니다. 그러나 []와 b []는 스택의 요소를 차지합니다. 따라서 다른 테스트는 int c을 추가하고 해당 주소를 비교하는 것입니다.

+0

예, 그것은 큰 가정입니다. 그래서 나는 그것에 대해 확신하지 못했습니다. 나는 더 많은 시험을했다. a와 b의 주소 순서는 고정되어 있지 않습니다. 그러나 두 mem 주소 사이에 여전히 균열이 없으며, 그들은 서로에게 맞습니다. –

+0

@RobertBean 바로 옆에 말할 때 문자를 세는 것을 의미합니까? 어떤 컴파일러를 사용하고 있습니까? 그리고 어떤 기계. – JackCColeman

+1

리터럴과 그 배치는 'a'와'b'가 모두 로컬 배열이기 때문에 무의미합니다. – molbdnilo

관련 문제