数组_多维数组_分析

VC++6.0编译器生成的数组越界

由于VC++6.0编译器,在栈中给变量和数组分配缓存区内存时,不预留保护区(0xCCCCCCCC),并且数组的寻址方式为

DWORD PTR DS:[EBP+EAX*4 - 28h]或DWORD PTR DS:[EBP-4]或DWORD PTR DS:[EBP+4]

[EBP+4] 在函数销毁执行ret命令时,会修改EIP,所以CPU会运行被修改后的函数 “返回地址”。

下面是代码测试:

//数组越界后,越界的值是ebp+4(即EIP返回地址)

void Helloword() {

    printf("==========helloword");

    getchar();

}

void arrYuJie() {

    int arr[5] = { 1,2,3,4,5 };

    arr[6] = (int)Helloword;

}

int main(int argc, char* argv[]){

    arrYuJie();

    printf("Hello World!\n");

    return 0;

}

arrYuJie:

004010D0  push        ebp

004010D1  mov        ebp,esp

004010D3  sub        esp,54h

004010D6  push        ebx

004010D7  push        esi

004010D8  push        edi

004010D9  lea        edi,[ebp-54h]

004010DC  mov        ecx,15h

004010E1  mov        eax,0CCCCCCCCh

004010E6  rep stos    dword ptr [edi]

004010E8  mov        dword ptr [ebp-14h],1

004010EF  mov        dword ptr [ebp-10h],2

004010F6  mov        dword ptr [ebp-0Ch],3

004010FD  mov        dword ptr [ebp-8],4

00401104  mov        dword ptr [ebp-4],5

0040110B  mov        dword ptr [ebp+4],offset @ILT+0(Helloword) (00401005)

00401112  pop        edi

00401113  pop        esi

00401114  pop        ebx

00401115  mov        esp,ebp

00401117  pop        ebp    

00401119   ret    ----------------------------------------->ret后会修改EIP的值,CPU会执行这个地址,就是Helloword这个函数的地址,如下:

@ILT+0(?Helloword@@YAXXZ):

00401005  jmp        Helloword (00401030)

Helloword:

00401030  push        ebp

00401031  mov        ebp,esp

00401033  sub        esp,44h

00401036  push        ebx

00401037  push        esi

00401038  push        edi

00401039  lea        edi,[ebp-44h]

0040103C  mov        ecx,11h

00401041  mov        eax,0CCCCCCCCh

00401046  rep stos    dword ptr [edi]

00401048  push        offset string "==========helloword" (0042301c)

0040104D  call        printf (004014b0)

00401052  add        esp,4

00401055  mov        eax,[__iob+4 (00425a34)]

0040105A  sub        eax,1

0040105D  mov        [__iob+4 (00425a34)],eax

00401062  cmp        dword ptr [__iob+4 (00425a34)],0

00401069  jl          Helloword+5Ch (0040108c)

0040106B  mov        ecx,dword ptr [__iob (00425a30)]

00401071  movsx      edx,byte ptr [ecx]

00401074  and        edx,0FFh

0040107A  mov        dword ptr [ebp-4],edx

0040107D  mov        eax,[__iob (00425a30)]

00401082  add        eax,1

00401085  mov        [__iob (00425a30)],eax

0040108A  jmp        Helloword+6Ch (0040109c)

0040108C  push        offset __iob (00425a30)

00401091  call        _filbuf (00401180)

00401096  add        esp,4

00401099  mov        dword ptr [ebp-4],eax

pop edi

0040109D  pop        esi

0040109E  pop        ebx

0040109F  add        esp,44h

004010A2  cmp        ebp,esp

004010A4  call        __chkesp (00401530)

004010A9  mov        esp,ebp

004010AB  pop        ebp

004010AC  ret


//桶排序 

visual studio 2019版本的编译器,在对变量或数组分配内存时,会预留int3(0xCCCCCCCC)缓存区,防止CPU执行越界后,导致程序飞

visual studio 2019版本的编译器,显然做了保护在分配栈缓冲内存时。并且寻址方式也做了变形保护。

例如:

//桶排序

void tongSort() {

    int index = 0;

    int arrS[8] = {2,4,6,5,3,8,2,1};

    int arrK[9] = { 0 };

    //把要排序的数组的数,放到空桶中,重复的数,桶里加1;

    for (int i = 0; i < 8;i++) {

        int t = arrS[i];

        arrK[t]++;

    }

    //将空桶里每个数值所对应的个数,依次放回源桶中排序列;

    for (int j = 0; j < 9;j++) {

        int t = arrK[j];

        if (t) {

            for (int n = 0; n < t;n++) {

            arrS[index] = j;

            index++;

            }

        }

    }

}


(三)多维数组

本质:多维数组就是一维数组,以二维数组举例(visual studio 2019版本的编译器);

1)编译器分内存空间:转为一位数组    int arr_one[ 3*4] = {  --- ---   };

2)//编译不过去,初始化太多。

int  arr[3][4] = {

                        {1,2,3,4,5},

                        {5},

                        {9}

                     }        

3)可编译就是乱,分配空间[3*4],正常分配,第二段不够补0

        int  arr[ 3 ] [4 ] = {1,2,3,4,5,6,7,8,9,11};

4)省略长度,编译可通过,4个一组。后面 [ 4 ] 的位置不可省略,前面的[  ]可以省略。总个数模上4来整数组分空间,还可补            0,能分几组就分几组。

        int  arr[  ][ 4 ] = {1,2,3,4,5,6,7,8,9,11};

5)寻址找到这个值    arr[ 1 ][ 2 ]  =  arr [ 1*4+2 ] 

        int  arr[3][4] = {

                               {2,3,4,9},

                                {5,4,1,8},

                                {2,7,5,4}

                             }     

6)三维数组:假设一共有5个班,每个班4个组,给个组3人。

        int  arr[ 5 ][ 4 ] [ 3 ]= {

                  {{4,1,4},{2,5,9},{5,4,3},{9,1,3}},

                  {{1,2,3},{12,52,1},{5,44,3},{9,12,31}},

                  {{4,1,8},{2,35,9},{5,4,6},{9,41,36}},

                  {{44,1,24},{2,51,3},{5,42,34},{9,1,3}},

                  {{4,16,47},{72,6,9},{7,64,5},{9,14,3}},

         }     

        寻址:第二个班,第三组的第二人,今年多大  

                    arr[ 1 ][ 2 ][ 1 ]   =  [ 1*4*3 + 2*3 + 1]  =  44

7)五维数组 int arr[ m ][ n ][ g ][ f ][ k ]

        寻址:arr[ 2 ][ 3 ][ 5 ][ 1 ][ 4 ]   = arr[ 2*n*g*f*k + 3*g*f*k + 5*f*k + 1*k + 4e ]


8)练习,归并排序,前提是两个数组都是有序的。

      j = 0  数组一:arr_1 [ 8 ] = { 3,5,7,11,13,15,21,25 };

     k = 0  数组二:arr_2 [ 6 ] = { 4,8,9,17,22,35 };

                             arr_new [ 14 ]={                                  };           



最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 221,273评论 6 515
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,349评论 3 398
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 167,709评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,520评论 1 296
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,515评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,158评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,755评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,660评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,203评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,287评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,427评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,122评论 5 349
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,801评论 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,272评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,393评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,808评论 3 376
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,440评论 2 359

推荐阅读更多精彩内容

  • 下面示例分别示例了函数内数组,数组作为参数,数组作为返回值 7 void Show(char szBuffer[]...
    Justin_901e阅读 286评论 0 0
  • C语言是面向过程的,而C++是面向对象的 ...
    小辰带你看世界阅读 480评论 0 1
  • 久违的晴天,家长会。 家长大会开好到教室时,离放学已经没多少时间了。班主任说已经安排了三个家长分享经验。 放学铃声...
    飘雪儿5阅读 7,524评论 16 22
  • 今天感恩节哎,感谢一直在我身边的亲朋好友。感恩相遇!感恩不离不弃。 中午开了第一次的党会,身份的转变要...
    迷月闪星情阅读 10,567评论 0 11
  • 可爱进取,孤独成精。努力飞翔,天堂翱翔。战争美好,孤独进取。胆大飞翔,成就辉煌。努力进取,遥望,和谐家园。可爱游走...
    赵原野阅读 2,735评论 1 1