2013-12-19 2 views
4

는 내가 알고 싶은 것은 회원 (여기가 numbername입니다) 저장하는 방법입니다C 컴파일러는 구조체에 메모리를 어떻게 할당합니까? 구조를 공부함으로써

struct 
{ 
     int number; 
     char name[nam]; 
}h; 

고려 의미하는 방법을 구조하는 컴파일러에 의해 메모리에 저장되어있는 질문에 나를 인도 (예를 들어 숫자가 주소 2000에 저장되고 name이 저장된 경우 순서대로 저장되거나 임의의 위치에 저장되는지 여부는 2990에 저장됩니까?

+3

해당 코드가 컴파일되지 않습니다. 'char nam [];을 원하셨습니까? – delnan

+0

글쎄, 엄격하게, 구조를위한 공간은 로더와 가상 메모리 관리자가 앱을 실행할 때 할당됩니다. –

답변

4

메모리는 구조체 멤버의 순서로 할당 :

+------------+------------------+-----+-----+-----+-----+-----+-----+ 
|   |  ........  |  |  |  |  |  |  | 
|   |     |  |  |  |  |  |  | 
+------------+--------+---------+-----+-----+-----+-----+-----+-----+ 
+   +  |  name[0]        name[nam-1] 
+------+-----+  |   +------------------+----------------+ 
     |    |       | 
     |    |       | 
     v    v       v 
    number   padding      name[nam] 

하지만, 배열과는 달리, 구조에 할당 된 메모리는 또는 포장되지 않을 수있다, 즉, 할당 된 공간 후 약간의 패딩이있을 수 있습니다 (첫 번째 멤버 앞에 패딩이 허용되지 않음).

+2

그래픽을 복사하여 게시 할 수 있습니까? @haccks – alk

+0

@alk; 참조를 추가했습니다. – haccks

+1

나는 한 번 이렇게 돈을 많이 쓴 사람을 안다. @haccks – alk

2

당신은 Data structure alignment에서 답을 찾을 수 있습니다

데이터 구조 정렬은 데이터를 정렬하고 컴퓨터 메모리에 액세스하는 방법입니다. 두 개의 별개이지만 관련 이슈 인 데이터 정렬 및 데이터 구조 패딩으로 구성됩니다. 현대 컴퓨터가 을 메모리 주소에서 읽거나 메모리 주소에 쓸 때, 단어 크기가 청크 (예 : 32 비트 시스템의 경우 4 바이트 청크)로 표시됩니다. 데이터 정렬 수단 데이터를 단어 크기의 배수와 같은 오프셋으로 놓으면 CPU 이 메모리를 처리하는 방식으로 인해 시스템 성능이 향상됩니다. 데이터를 정렬하려면 마지막 데이터 구조의 끝과 다음 데이터 구조의 시작 부분 사이에 의미가없는 바이트 인 을 삽입해야 할 수도 있습니다.이 구조는 데이터 구조체 패딩입니다.

2

필드는 항상 쓰여진 순서대로 표시되지만 필드 사이에는 패딩이있을 수 있습니다.

-1

배열은 두 가지 방법으로 저장할 수 있습니다. 구조에서 크기가 일정한 경우 char array[42] 또는 컴파일시 알 수없는 크기 인 경우 malloc을 사용하여 할당되고 구조의 배열에 대한 포인터가 있어야합니다.

첫 번째 경우 메모리 한 블록에 전체 배열을 비롯한 모든 구조 데이터가 포함됩니다.

두 번째 경우에는 구조체 요소의 주소에서 메모리에있는 배열의 실제 주소를 포함하는 포인터가 있으므로 포인터가 가리키는 주소 만 볼 수 있습니다)

2

첫 해에 내 강의에서이 이미지를 복사했습니다. 나는 (그것은해야)가 도움이되기를 바랍니다 :

enter image description here

+2

흠 ... 'sizeof (구조체)> = Σ 크기 (멤버)'를 따기. –

+0

따기침이란 무엇입니까? :/ – Maroun

+1

'Picking nits'는 'nitpicking'을 쓰는 또 다른 방법으로, 원래 사람의 두피에서 'nits'또는 'lice eggs'또는 'lice larvae'를 찾는 과정을 말하며, 미세한 물체를 찾는 고된 과정 제거해야합니다. 요즘은 작은 결함을 찾는 것을 말합니다. Apple 사전은 질식이는 '작거나 중요하지 않은 오류 또는 결점을 찾고 있습니다. 불필요하게 '그리고'까다로운 잘못 찾기 '를 비난하기 위해 –

2

C99에서 6.7.2.1/13 구조와 노동 조합 지정자 구조 개체 내에서

, 비 비트 필드 멤버와 단위 에서 비트 필드가 상주하는 주소는 선언 된 의 순서로 증가하는 주소를가집니다.적절히 으로 변환 된 구조체 개체에 대한 포인터는 초기 멤버 (또는 해당 멤버가 비트 필드 인 경우 해당 멤버가 상주하는 단위)를 가리키고 그 반대의 경우도 마찬가지입니다. 구조체 개체 내에 이름이없는 패딩이있을 수 있지만 시작 부분은 이 아닙니다.

따라서 name 필드는 예제에서 number 필드를 따라야하지만 두 필드 사이에 패딩이 추가 될 수 있습니다. name 필드 뒤에 패딩이있을 수도 있습니다.이 필드는 이러한 구조체의 배열이 각 요소를 적절하게 정렬하도록합니다.

관련 문제