首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >malloc分配错误- llvm ir代码

malloc分配错误- llvm ir代码
EN

Stack Overflow用户
提问于 2018-06-06 05:02:52
回答 1查看 297关注 0票数 0

在下面的代码中,我创建了几个4个元素长度的数组。然而,当我让它们变大(5或6个)元素时,我得到了下面的错误。

IR代码

代码语言:javascript
复制
declare [4 x double] @malloc(double)

declare double @printd(double)

define double @__anon_expr0() {
entry:
  %foo = alloca [4 x double]
  %calltmp = call [4 x double] @malloc(double 2.560000e+02)
  %0 = insertvalue [4 x double] %calltmp, double 1.000000e+00, 0
  %1 = insertvalue [4 x double] %0, double 1.000000e+00, 1
  %2 = insertvalue [4 x double] %1, double 1.000000e+00, 2
  store [4 x double] %2, [4 x double]* %foo
  %3 = getelementptr [4 x double], [4 x double]* %foo, i32 0, i32 0
  %__ = load double, double* %3
  %calltmp1 = call double @printd(double %__)
  %4 = getelementptr [4 x double], [4 x double]* %foo, i32 0, i32 0
  %__2 = load double, double* %4
  %calltmp3 = call double @printd(double %__2)
  ret double %calltmp3
}

define i32 @main() {
  call double @__anon_expr0 ()
  ret i32 0
}

错误

代码语言:javascript
复制
built(16968,0x7fff8f39c380) malloc: *** mach_vm_map(size=140732867354624) failed (error code=3)
*** error: can't allocate region
*** set a breakpoint in malloc_error_break to debug

导致该错误的原因是什么?我认为malloc可以处理超过4个元素的数组。我在这里做错了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-06 06:09:23

malloc的签名是void* malloc(size_t size),其中size_t是特定于平台的整数类型(32位平台上为32位,64位平台上为64位)。

因此,当您声明它为一个双精度值并如此调用它时,您正在调用未定义的行为。实际上,对于第一个参数,您需要将值256.0移动到双寄存器中,然后调用malloc,它将从整数寄存器中读取第一个参数的参数(该寄存器从未初始化)。

相反,您应该在64位平台上声明malloc以获取i64,而在32位平台上声明i32。然后,您还应该使用整数参数调用它(例如,用2.56e2代替256 )。

另一个问题是返回类型:malloc返回一个指针,而不是数组(C函数从不返回数组--这在语法上是不可能的)。所以它应该这样声明和使用。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50708880

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档