双* android ndk 崩溃

double* android ndk crash

我遇到了 android ndk 的特殊问题。我正在尝试读取 unsigned char* readBytes 中先前存储的一组字节(先前已分配并从文件中读取)。数据需要被解释为double。

unsigned char* svDataOffset=(unsigned char*)(readBytes+byteCounter);

unsigned char* chars=(unsigned char*)(svDataOffset+2); //offset of 2 is where the data is
__android_log_print(ANDROID_LOG_INFO,"va","%x   %u   %u   %u %u",chars[0],svDataOffset,shortPointer,doublePointer,chars);//print all the addresses
__android_log_print(ANDROID_LOG_INFO,"index","%x",chars[1]);
__android_log_print(ANDROID_LOG_INFO,"index","%x",chars[2]);
__android_log_print(ANDROID_LOG_INFO,"index","%x",chars[3]);
__android_log_print(ANDROID_LOG_INFO,"index","%x",chars[4]);
__android_log_print(ANDROID_LOG_INFO,"index","%x",chars[5]);
__android_log_print(ANDROID_LOG_INFO,"index","%x",chars[6]);
__android_log_print(ANDROID_LOG_INFO,"va","%x",chars[7]);

double* ptr=(double*)chars;
__android_log_print(ANDROID_LOG_INFO,"va","%u  ",ptr);
__android_log_print(ANDROID_LOG_INFO,"val"," %x",*ptr++);
__android_log_print(ANDROID_LOG_INFO,"val"," %x",*ptr);

在上面的代码中,我将double数据开始的位置的地址取到一个unsigned char中并打印出数据,这正是我想要的数据。但是,当我尝试以 double*long long* 的形式访问它时,程序崩溃了。同一组字节可以读为 float*int* 并崩溃(给出一些垃圾值)。

这是错误:

06-23 14:24:57.166: A/libc(11913): Fatal signal 7 (SIGBUS) at 0x7cc20236 (code=1), thread 11913 

Logact 输出:

06-23 15:26:00.771: I/va(22471): 74   2093089332   2093089332   2093089334  2093089334
06-23 15:26:00.771: I/index(22471): 22
06-23 15:26:00.771: I/index(22471): 56
06-23 15:26:00.771: I/index(22471): 9b
06-23 15:26:00.771: I/index(22471): 33
06-23 15:26:00.771: I/index(22471): e
06-23 15:26:00.771: I/index(22471): e9
06-23 15:26:00.771: I/va(22471): 3f
06-23 15:26:00.771: I/va(22471): 2093089334  
06-23 15:26:00.771: A/libc(22471): Fatal signal 7 (SIGBUS) at 0x7cc20236 (code=1), thread 22471 (e.ohr.tamilohwr)

请帮忙解决错误。

谢谢。

我看到了几个可能的原因。

  1. 首先,将 char* 转换为 double* 然后通过该指针访问它是未定义的行为。大部分时间它都有效,但您会收到警告。

  2. 指针未对齐。 double 很可能应该对齐到 8 个字节,并且您通过等于 2093089334 的指针读取它,即 0x7CC20236 - 显然没有对齐到 8 个字节。这在 ARM 处理器上可能很关键。

  3. 格式模式错误:您试图用 %x 打印 double,这是错误的。使用 %f%g 或其他任何合适的内容。

要修复 (1) 和 (2) 分别分配 double*,并将 memcpy 适当的部分数据放入其中。