双* 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)
请帮忙解决错误。
谢谢。
我看到了几个可能的原因。
首先,将 char*
转换为 double*
然后通过该指针访问它是未定义的行为。大部分时间它都有效,但您会收到警告。
指针未对齐。 double
很可能应该对齐到 8 个字节,并且您通过等于 2093089334
的指针读取它,即 0x7CC20236
- 显然没有对齐到 8 个字节。这在 ARM 处理器上可能很关键。
格式模式错误:您试图用 %x
打印 double
,这是错误的。使用 %f
、%g
或其他任何合适的内容。
要修复 (1) 和 (2) 分别分配 double*
,并将 memcpy
适当的部分数据放入其中。
我遇到了 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)
请帮忙解决错误。
谢谢。
我看到了几个可能的原因。
首先,将
char*
转换为double*
然后通过该指针访问它是未定义的行为。大部分时间它都有效,但您会收到警告。指针未对齐。
double
很可能应该对齐到 8 个字节,并且您通过等于2093089334
的指针读取它,即0x7CC20236
- 显然没有对齐到 8 个字节。这在 ARM 处理器上可能很关键。格式模式错误:您试图用
%x
打印double
,这是错误的。使用%f
、%g
或其他任何合适的内容。
要修复 (1) 和 (2) 分别分配 double*
,并将 memcpy
适当的部分数据放入其中。