다음은 메모리 할당을 검사하기 위해 작성한 샘플 프로그램입니다.메모리는 스택, 힙에 어떻게 배열됩니까?
[email protected]:~/working_dir/pavan/C$ cat mem3.c
#include <stdio.h>
#include <string.h>
#include <stdio.h>
/* This is generated by a template program */
typedef struct stru_s{
char str1[4], str2[4], str3[4];
}stru_t;
int main(){
stru_t st;
char str1[4], str2[4], str3[4];
char *mstr1, *mstr2, *mstr3, *mstr4, *mstr5;;
mstr1= (char*)malloc(4);
mstr2= (char*)malloc(4);
mstr3= (char*)malloc(4);
mstr4= (char*)malloc(8);
mstr5= (char*)malloc(16);
strcpy(str1, "aaa");
strcpy(str2, "bbb");
strcpy(str3, "ccc");
strcpy(mstr1, "xxx");
strcpy(mstr2, "yyy");
strcpy(mstr3, "zzz");
return 0;
}
아래는 gdb를 사용한 메모리 검사입니다.
[email protected]:~/working_dir/pavan/C$ gdb mem3
GNU gdb (GDB) Red Hat Enterprise Linux (7.2-60.el6_4.1)
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/xkumapu/working_dir/pavan/C/mem3...done.
(gdb) b 1
Breakpoint 1 at 0x4005f0: file mem3.c, line 1.
(gdb) r
Starting program: /home/xkumapu/working_dir/pavan/C/mem3
[Thread debugging using libthread_db enabled]
Breakpoint 1, main() at mem3.c:17
17 mstr1= (char*)malloc(4);
Missing separate debuginfos, use: debuginfo-install glibc-2.12-1.192.el6.x86_64
(gdb) n
18 mstr2= (char*)malloc(4);
(gdb) n
19 mstr3= (char*)malloc(4);
(gdb) n
20 mstr4= (char*)malloc(8);
(gdb) n
21 mstr5= (char*)malloc(16);
(gdb) n
23 strcpy(str1, "aaa");
(gdb) n
24 strcpy(str2, "bbb");
(gdb)
25 strcpy(str3, "ccc");
(gdb)
26 strcpy(mstr1, "xxx");
(gdb)
27 strcpy(mstr2, "yyy");
(gdb)
28 strcpy(mstr3, "zzz");
(gdb)
30 return 0;
(gdb)
31 }
(gdb) x str1
0x7fffffffe330: 0x00616161
(gdb) x str2
0x7fffffffe320: 0x00626262
(gdb) x str3
0x7fffffffe310: 0x00636363
(gdb) x &str3
0x7fffffffe310: 0x00636363
(gdb) x &str2
0x7fffffffe320: 0x00626262
(gdb) x &str1
0x7fffffffe330: 0x00616161 <- Aligned to 16 bytes. (from 320 to 330)
(gdb) x &mstr1
0x7fffffffe358: 0x00601060
(gdb) x &mstr2
0x7fffffffe360: 0x006010a0
(gdb) x &mstr3
0x7fffffffe368: 0x006010e0 <- aligned to 40 bytes. (from 0a0 to 0e0)
(gdb) x &st.str
There is no member named str.
(gdb) x &st.str3
0x7fffffffe348: 0x00400735
(gdb) x &st.str2
0x7fffffffe344: 0x00007fff
(gdb) x &st.str1
0x7fffffffe340: 0xffffe478 <- Aligned to just 4 bytes.(from 340 to 344)
(gdb) q
A debugging session is active.
Inferior 1 [process 12541] will be killed.
Quit anyway? (y or n) y
구조에서 다른 유형의 정렬이 필요한 이유를 설명 할 수 있습니까? 그리고 그것은 힙에 메모리를 사용하는 MCB입니까?
"MCB"란 무엇을 의미합니까? – kalaracey
@kalaracey 메모리 제어 블록. 동적으로 할당 된 각 메모리 덩어리 앞에 추가 될 구조체. 이 구조체에는 두 개의 값 {is_available, size}가 포함됩니다. – pavan