c - 当我的数组长度大于 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)处的值:(一些随机数)”我得到段错误(核心转储)
解决方案
推荐阅读
- ns2 - 当将节点的随机运动设置为 0 时会出现错误:“调用类 $cls 时出错:$args”$...”
- c - C-->如何使用信号量协调进程行为?
- amazon-web-services - AWS Organizations 是集中式策略管理系统吗
- ios - cellForRowAtIndex 没有被调用
- java - Java Paho MQTT 检测重新连接
- django - Django-Tables2 LinkColumn 链接指向错误的项目
- html - 如果文本变长,为什么表格单元格中的字体大小不正确?
- r - R Shiny - 从 CSV 文件动态过滤 - 行丢失
- ios - Swift UITableview Header Section 约束问题
- javascript - 单击侧边栏项目时如何更改主要内容