以下是错误的要点。如果我在代码的任何地方调用printf、sprintf或fprintf来显示浮点数,我会收到SIGSEGV (EXC_BAD_ACCESS)错误。让我举个例子。
以下代码会抛出错误:
float f = 0.5f;
printf("%f\n",f);
这段代码不会:
float f = 0.5f;
printf("%d\n",f);
我知道这里有一个隐式转换,但我不太明白为什么打印浮点数和打印整数会引发错误。
注意:代码的一部分使用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;
}
然后上述的
printf
语句出现在代码中较晚的位置。我包含
malloc
的原因是因为据我所知,SIGSEGV
与格式不正确的malloc
调用有关。因此,如果数组初始化是导致问题的原因,我想知道:
- 为什么?
- 我如何更改
malloc
代码来解决这个问题?
进程:pole [5453] 路径:{REDACTED} 标识符:pole 版本:??? (???) 代码类型:X86-64 (Native) 父进程: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 at 0x0000000100074f3b 崩溃线程:0 Dispatch queue: com.apple.main-thread
线程0崩溃:Dispatch queue: 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 pole 0x00000001000028b5 Balance::sarsa() + 187 7 pole 0x0000000100002e54 main + 49 8 pole 0x00000001000010a8 start + 52
线程0崩溃时的X86线程状态(64位): rax: 0x0000000000000001 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 rip: 0x00007fff828d489e rfl: 0x0000000000010202 cr2: 0x0000000100074f3b
二进制映像: 0x100000000 - 0x100003fff +pole ??? (???) {REDACTED} 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 - 0x7fffffe01fff libSystem.B.dylib ??? (???) /usr/lib/libSystem.B.dylib
型号:MacBookPro4,1,BootROM MBP41.00C1
感谢您的选择。
malloc()
返回的值是否非空。 - Simon Nickerson