首页 > 解决方案 > 当我的数组长度大于 2 时,为什么会出现段错误

问题描述

我正在使用 malloc 创建一个长度长度的数组(在我因在 c++ 中使用 malloc 而受到批评之前,我只想这样做,因为我想学习)。每当我的长度大于 2 时,我都会遇到段错误,我不知道为什么。当我使用调试器时,当我让编译器输出 .S 文件时,在不存在的行上出现段错误。

这适用于 Linux x86-64

最初我尝试创建数组是 x64 asm,但是当我不断收到段错误时,我尝试在 C++ 中编写相同的东西,但我一直收到段错误

无需打印即可完成fillArrayWithRandom64的c ++代码

int main(){
    uint64_t length=4;
    uint64_t* arr=(uint64_t*)malloc(8*length);
    for(uint64_t i=0;i<length;i++){
        *(arr+i)=genRandom64();
        cout<<"Value at "<<i<<":"<<*(arr+i)<<endl;
    }
    free(arr);
    return 0;
}

生成数组并填充随机数

fillArrayWithRandom64:#rdi is length
#returns pointer to array
    cmp     rdi,0
    jle     _fillArrayWithRandom64Bad

    push    rbp
    mov     rbp,rsp

    push    rdi     #-8     length
    imul    rdi,8
    call    malloc@PLT
    push    rax     #-16    pointer
    pushq   0       #-24    counter

    _fillArrayWithRandom64L1:
        call    genRandom64
        mov     rbx,[rbp-16]
        mov     rcx,[rbp-24]
        mov     [rbx+rcx*8],rax

        inc     rcx
        mov     [rbp-24],rcx
        cmp     rcx,[rbp-8]
        jl      _fillArrayWithRandom64L1

    mov     rax,[rbp-16]
    mov     rsp,rbp
    pop     rbp
    ret
    _fillArrayWithRandom64Bad:
        mov     rax,0
        ret

我的随机数函数

genRandom64:#returns 64
    call    rand@PLT
    push    rax
    call    rand@PLT
    shl     rax,32
    pop     rbx
    or      rax,rbx
    ret

我的预期输出是“(i)处的值:(一些随机数)”我得到段错误(核心转储)

标签: clinuxassembly

解决方案


推荐阅读