gpt4 book ai didi

c++ - 双 * android ndk 崩溃

转载 作者:太空宇宙 更新时间:2023-11-04 13:32:08 28 4
gpt4 key购买 nike

我遇到了 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 

逻辑输出:

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 适当的部分数据放入其中。

关于c++ - 双 * android ndk 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30999279/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com