Gle*_*iet 4 c malloc printf segmentation-fault
首先,对于任何交叉发布,我们深表歉意。希望我不会在这里重复问题,但我无法在其他地方找到它(通过 Google 和 Stack Overflow)。
这是错误的要点。如果我打电话printf,sprintf或者fprintf我的代码中的任何位置,显示浮动,我得到一个SIGSEGV (EXC_BAD_ACCESS)错误。让我举个例子吧。
以下抛出错误:
float f = 0.5f;
printf("%f\n",f);
Run Code Online (Sandbox Code Playgroud)
此代码不会:
float f = 0.5f;
printf("%d\n",f);
Run Code Online (Sandbox Code Playgroud)
我意识到那里有一个隐式转换,但我并不关心。我只是无法理解为什么打印浮点数与打印整数会引发错误。
注意:部分代码用于malloc创建一些非常大的多维数组。但是,这些打印语句没有以任何方式引用这些数组。这是我如何声明这些数组的示例。
#define X_LEN 20
#define XDOT_LEN 20
#define THETA_LEN 20
#define THETADOT_LEN 20
#define NUM_STATES (X_LEN+1) * (XDOT_LEN+1) * (THETA_LEN+1) * (THETADOT_LEN+1)
#define NUM_ACTS 100
float *states = (float *)malloc(NUM_STATES * sizeof(float));
// as opposed to float states[NUM_STATES] (more memory effecient)
float **q = (float**)malloc(NUM_STATES * sizeof(float*));
for(int i=0; i < NUM_STATES; i++) {
float *a = (float*)malloc(NUM_ACTS * sizeof(float));
for(int j=0; j < NUM_ACTS; j++) {
a[j] = 0.0f;
}
q[i] = a;
}
Run Code Online (Sandbox Code Playgroud)
然后上面的printf语句出现在代码的后面。
我包含这些malloc东西的原因是因为据我所知,SIGSEGV这与格式不佳的malloc调用有关。因此,如果数组初始化是导致问题的原因,我想知道:
malloc代码以解决此问题?我已经包含了 OS X 生成的崩溃日志,以防万一可以帮助任何人。
工艺:立杆【5453】
路径:{已编辑}
标识符:极点
版本: ???(???)
代码类型:X86-64(本机)
父进程:bash [5441]
日期/时间:2009-12-08 11:38:38.358 -0600
操作系统版本:Mac OS X 10.6.2 (10C540)
报告版本:6
自上次报告以来的间隔:130074 秒
自上次报告以来的崩溃次数:68
自上次报告以来每个应用程序崩溃:63
匿名 UUID:CA20CF15-8C46-4C85-A793-6C69F9F40140
异常类型:EXC_BAD_ACCESS (SIGSEGV)
异常代码:KERN_INVALID_ADDRESS 在 0x0000000100074f3b
崩溃线程:0 调度队列:com.apple.main-thread
线程 0 崩溃:调度队列:com.apple.main-thread
0 libSystem.B.dylib 0x00007fff828d489e __Balloc_D2A + 164
1 libSystem.B.dylib 0x00007fff828d49b8 __d2b_D2A + 45
2 libSystem.B.dylib 0x00007fff828e8c74 __dtoa + 320
3 libSystem.B.dylib 0x00007fff828aa960 __vfprintf + 4980
4 libSystem.B.dylib 0x00007fff828ec7db vfprintf_l + 111
5 libSystem.B.dylib 0x00007fff828ec75e fprintf + 196
6 极 0x00000001000028b5 平衡::sarsa() + 187
7 极 0x0000000100002e54 主 + 49
8 极 0x00000001000010a8 开始 + 52
线程 0 因 X86 线程状态(64 位)崩溃:
rax:0x000000000000001 rbx:0x000000010042cca0 rcx:0x000000010042cca8 rdx:0x0000000100074f3b
rdi:0x000000000000000e rsi:0x00007fff5fbfecbc rbp:0x00007fff5fbfeba0 rsp:0x00007fff5fbfeb90
r8:0x00007fff5fbff0b0 r9:0x0000000000000000 r10:0x00000000ffffffff r11:0x000000010083a40b
r12: 0x0000000000000001 r13: 0x00007fff5fbfecb8 r14: 0x00007fff5fbfecbc r15: 0x000000010000363e
翻录:0x00007fff828d489e rfl:0x0000000000010202 cr2:0x0000000100074f3b
二进制图像:
0x100000000 - 0x100003fff +极点???(???) {已编辑}
0x7fff5fc00000 - 0x7fff5fc3bdef dyld 132.1 (???) /usr/lib/dyld
0x7fff81697000 - 0x7fff8169bff7 libmathCommon.A.dylib ??? (???) /usr/lib/system/libmathCommon.A.dylib
0x7fff8289c000 - 0x7fff82a5aff7 libSystem.B.dylib ??? (???) /usr/lib/libSystem.B.dylib
0x7fff83c4c000 - 0x7fff83cc9fef libstdc++.6.dylib ??? (???) /usr/lib/libstdc++.6.dylib
0x7fffffe00000 - 0x7ffffffe01fff libSystem.B.dylib ??? (???) /usr/lib/libSystem.B.dylib
型号:MacBookPro4,1,BootROM MBP41.00C1.B03,2 个处理器,Intel Core 2 Duo,2.4 GHz,2 GB,SMC 1.27f2
显卡:NVIDIA GeForce 8600M GT、GeForce 8600M GT、PCIe、256 MB
内存模块:global_name
AirPort:spairport_wireless_card_type_airport_extreme (0x14E4, 0x8C),Broadcom BCM43xx 1.0 (5.10.91.19)
蓝牙:2.2.4f3版本,2个服务,1个设备,1个传入串口
网络服务:AirPort、AirPort、en1
串行 ATA 设备:Hitachi HTS542520K9SA00,186.31 GB
并行ATA设备:MATSHITADVD-R UJ-867
USB 设备:内置 iSight、0x05ac(Apple Inc.)、0x8502、0xfd400000
USB 设备:Apple 内置键盘/触控板、0x05ac(Apple Inc.)、0x0230、0x5d200000
USB 设备:IR 接收器、0x05ac(Apple Inc.)、0x8242、0x5d100000
USB 设备:BRCM2046 集线器、0x0a5c(Broadcom Corp.)、0x4500、0x1a100000
USB 设备:蓝牙 USB 主机控制器、0x05ac(Apple Inc.)、0x820f、0x1a110000
谢谢。
您的代码中的其他地方存在与该printf语句无关的错误。您正在某处踩踏内存,但直到printf尝试使用 分配一些内存时问题才会显现出来__BAlloc_D2A,这会崩溃,因为它用于跟踪空闲内存块的堆数据结构已损坏。
为了尝试检测您在内存上的什么位置,有许多可用的工具。如果您使用的是 Linux,我建议您使用valgrind,它本质上是在虚拟机中运行您的代码,并在您执行任何非法操作(例如读/写内存越界、读取未初始化的变量等)时通知您。但是,它不可用在 Mac OS X 中(还)。
一种选择是使用libgmalloc:
% cat gmalloctest.c
#include <stdlib.h>
#include <stdio.h>
main()
{
unsigned *buffer = (unsigned *)malloc(sizeof(unsigned) * 100);
unsigned i;
for (i = 0; i < 200; i++) {
buffer[i] = i;
}
for (i = 0; i < 200; i++) {
printf ("%d ", buffer[i]);
}
}
% cc -g -o gmalloctest gmalloctest.c
% gdb gmalloctest
Reading symbols for shared libraries .. done
(gdb) set env DYLD_INSERT_LIBRARIES /usr/lib/libgmalloc.dylib
(gdb) r
Starting program: gmalloctest
Reading symbols for shared libraries .. done
GuardMalloc: Allocations will be placed on 16 byte boundaries.
GuardMalloc: - Some buffer overruns may not be noticed.
GuardMalloc: - Applications using vector instructions (e.g., SSE or Altivec) should work.
GuardMalloc: GuardMalloc version 19
Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: KERN_PROTECTION_FAILURE at address: 0xb000d000
0x00001f65 in main () at gmalloctest.c:10
10 buffer[i] = i;
(gdb) print i
$1 = 100
(gdb) where
#0 0x00001f65 in main () at gmalloctest.c:10
(gdb)
Run Code Online (Sandbox Code Playgroud)
另请参阅启用 Malloc 调试功能。