malloc内存分配常见的两个错误:runtime error: store to address、、AddressSanitizer: heap-buffer-overflow

runtime error: store to address 0x6020000000b8 、、、 和AddressSanitizer: heap-buffer-overflow on address 、、、

这两个问题为力扣刷题malloc分配内存空间的常见错误。

问题1:

Line 32: Char 17: runtime error: store to address 0x6020000000b8 with insufficient space for an object of type 'int' [solution.c]
0x6020000000b8: note: pointer points here
 02 00 00 00  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  00 00 00 00

问题代码:

  int *a = (int *)malloc(sizeof(a));

解决方案:将sizeof(a)改为sizeof(int)*nums
nums为数组大小

 int *a = (int *)malloc(sizeof(int)*nums);

问题2:

=================================================================
==42==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x6020000001d4 at pc 0x7f0a099c0f2d bp 0x7ffdbdb287e0 sp 0x7ffdbdb27f88
WRITE of size 8 at 0x6020000001d4 thread T0
    #0 0x7f0a099c0f2c  (/lib/x86_64-linux-gnu/libasan.so.5+0x67f2c)
    #3 0x7f0a08e210b2 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x270b2)
0x6020000001d4 is located 0 bytes to the right of 4-byte region [0x6020000001d0,0x6020000001d4)
allocated by thread T0 here:
    #0 0x7f0a09a66bc8 in malloc (/lib/x86_64-linux-gnu/libasan.so.5+0x10dbc8)
    #3 0x7f0a08e210b2 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x270b2)
SUMMARY: AddressSanitizer: heap-buffer-overflow (/lib/x86_64-linux-gnu/libasan.so.5+0x67f2c) 
Shadow bytes around the buggy address:
  0x0c047fff7fe0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x0c047fff7ff0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x0c047fff8000: fa fa fd fd fa fa 00 00 fa fa 00 00 fa fa 00 00
  0x0c047fff8010: fa fa 00 00 fa fa 00 00 fa fa 05 fa fa fa fd fa
  0x0c047fff8020: fa fa 00 00 fa fa 00 00 fa fa 00 fa fa fa 06 fa
=>0x0c047fff8030: fa fa fd fa fa fa 00 00 fa fa[04]fa fa fa fa fa
  0x0c047fff8040: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
  0x0c047fff8050: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
  0x0c047fff8060: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
  0x0c047fff8070: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
  0x0c047fff8080: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
Shadow byte legend (one shadow byte represents 8 application bytes):
  Addressable:           00
  Partially addressable: 01 02 03 04 05 06 07 
  Heap left redzone:       fa
  Freed heap region:       fd
  Stack left redzone:      f1
  Stack mid redzone:       f2
  Stack right redzone:     f3
  Stack after return:      f5
  Stack use after scope:   f8
  Global redzone:          f9
  Global init order:       f6
  Poisoned by user:        f7
  Container overflow:      fc
  Array cookie:            ac
  Intra object redzone:    bb
  ASan internal:           fe
  Left alloca redzone:     ca
  Right alloca redzone:    cb
  Shadow gap:              cc
==42==ABORTING

问题代码:

   int *a = (int *)malloc(sizeof(int)*nums);

解决方案:数组大小定义过小,导致访问越界,适当增加数组的大小即可。

   int *a = (int *)malloc(sizeof(int)*(nums+1);
error l107: address space overflow 是指地址空间溢出错误。在计算机系统中,每个进程都有自己的地址空间,用于存储程序和数据。地址空间包括程序代码、全局变量、局部变量、堆栈以及其他相关的资源。 当出现 error l107: address space overflow 错误时,意味着进程已经使用了超过其可用地址空间的容量。这可能是由于以下几个原因造成的: 1. 程序设计不当:程序中使用了大量的全局变量、静态变量或常量并且没有及时释放。这样会导致地址空间的使用量增大,超过了系统限制的上限。 2. 递归调用深度过大:如果程序使用了递归函数,并且递归深度很大,则会占用大量的堆栈空间。当堆栈空间不足时,就会触发地址空间溢出错误。 3. 动态内存管理问题:使用动态内存分配函数(如malloc、new等)分配内存时,如果没有及时释放已分配的内存,则会导致堆空间的使用量不断增加,从而引发地址空间溢出。 为了解决 error l107: address space overflow 错误,我们可以采取以下措施: 1. 优化程序设计:避免过多使用全局变量、静态变量和常量,尽量使用局部变量,并及时释放不再使用的资源。 2. 减少递归深度:修改递归函数的设计,尽量减少递归调用的深度,或者改用循环来替代递归。 3. 合理管理动态内存:在使用动态内存分配函数分配内存后,应该及时释放已经不再使用的内存空间,以免堆空间的使用量过大。 通过以上措施,我们可以有效地避免和解决 error l107: address space overflow 错误,确保程序的正常运行。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值