【发布时间】:2019-09-22 11:35:52
【问题描述】:
我有以下功能:
void f(){
char a[]="THIS IS A STR 1";
char b[]="THIS IS A STR 2";
char c[]="THIS IS A STR 3";
char d[]="THIS IS A STR 4";
}
当我正常编译和运行这个程序时,这些字符串是这样分配在堆栈上的:
08 00 00 00 04 00 00 00 10 00 00 00 10 00 00 00 ................
10 71 c7 64 fc 7f 00 00 07 a9 90 7b 24 56 00 00 .q.d.......{$V..
54 48 49 53 20 49 53 20 41 20 53 54 52 20 31 00 THIS IS A STR 1.
54 48 49 53 20 49 53 20 41 20 53 54 52 20 32 00 THIS IS A STR 2.
54 48 49 53 20 49 53 20 41 20 53 54 52 20 33 00 THIS IS A STR 3.
54 48 49 53 20 49 53 20 41 20 53 54 52 20 34 00 THIS IS A STR 4.
a0 69 d9 76 c8 7f 00 00 00 dc ad e1 c7 89 e9 11 .i.v............
30 71 c7 64 fc 7f 00 00 37 a9 90 7b 24 56 00 00 0q.d....7..{$V..``
堆栈向更小的内存地址增长(在本例中为“向上”),因此在我看来这些字符串的存储顺序是相反的。
而当我使用 -fno-stack-protector 编译和运行时,我得到了“正确”的排序。
00 00 00 2e 10 00 00 00 08 00 00 00 05 00 00 00 ................
80 20 05 0f ff 7f 00 00 88 58 bb 32 96 55 00 00 . .......X.2.U..
54 48 49 53 20 49 53 20 41 20 53 54 52 20 34 00 THIS IS A STR 4.
54 48 49 53 20 49 53 20 41 20 53 54 52 20 33 00 THIS IS A STR 3.
54 48 49 53 20 49 53 20 41 20 53 54 52 20 32 00 THIS IS A STR 2.
54 48 49 53 20 49 53 20 41 20 53 54 52 20 31 00 THIS IS A STR 1.
a0 20 05 0f ff 7f 00 00 a4 58 bb 32 96 55 00 00 . .......X.2.U..
88 21 05 0f ff 7f 00 00 00 00 00 00 02 00 00 00 .!..............
我的印象是堆栈保护器所做的所有事情都放在堆栈金丝雀中,那么为什么要像这样重新排序内存分配方式?
【问题讨论】: