1. 程式人生 > >Android平臺,C/C++程式碼記憶體對齊問題(signal SIGBUS Error)

Android平臺,C/C++程式碼記憶體對齊問題(signal SIGBUS Error)

最近手機版本老出現崩潰,之前出現過,但很偶然。最近出現機率比較高,就跟查一下。
報了signal SIGBUS BUS Error,最終定位在uint32_t i32 = *((uint32_t*)m_data); 這句語出了問題, 確認m_data記憶體是正確的,並且在PC機上執行是正常的。

後面查到原因是x86架構CPU是支援記憶體非對齊訪問,而手機的CPU採用的是RISC架構,為了提高訪問效率,不支援非對齊訪問。
也就是說將記憶體m_data轉成無符號整形unit32_t,記憶體地址需要是4的整數倍。

將uint32_t i32 = *((uint32_t*)m_data)改為
uint32_t i32 = 0;
char* p = (char*)&i32;
for(int i =0;i < 4;i++)
{
    p[i] = m_data[i];

}

BUG 修復了,哈哈

相關推薦

Android平臺C/C++程式碼記憶體問題(signal SIGBUS Error)

最近手機版本老出現崩潰,之前出現過,但很偶然。最近出現機率比較高,就跟查一下。 報了signal SIGBUS BUS Error,最終定位在uint32_t i32 = *((uint32_t*)m_data); 這句語出了問題, 確認m_data記憶體是正確的,並且在P

c++結構體記憶體原理和方法

假設我們同時宣告兩個變數:  char a;  short b;  用&(取地址符號)觀察變數a,  b的地址的話,我們會發現(以16位CPU為例):  如果a的地址是0x0000,那麼b的地址將會是0x0002或者是0x0004。  那麼就出現這樣一個問題:0x0001這個地址沒有被使用,那它幹

C 深度剖析記憶體

首先說明一下,本文是轉載自: 引言      考慮下面的結構體定義: typedef struct{ char c1; short s; char c2; int i; }T_FOO;      假設這個結構體的成員在記憶體中是緊湊排列的,且

關於C語言記憶體提高定址效率問題

前言: 計算機的記憶體都是以位元組為單位來劃分的,CPU一般都是通過地址匯流排來訪問記憶體的,一次能處理幾個位元組,就命令地址匯流排去訪問幾個位元組,32位的CPU一次能處理4個位元組,就命令地址匯流排一次讀取4個位元組,讀少了浪費主頻,讀多了也處理不了。64位的CPU一般

Unity使用NDK在Android平臺上引用C++程式碼的so檔案(下)

由於最近進入了公司,手頭上的工作需要一點一點的去適應,所以沒有空來完成接下來的博文,今天突然想到寫一些,發現這麼久沒有接觸了,好像已經忘記了很多,寫下這個博文,我也正好回顧一個這一方面的知識。 關於在unity上使用C++的程式碼需要用到SO檔案了,這就像Cocos上使用C

C語言】結構體、聯合記憶體規則總結

一、結構體 1.1什麼是結構體       在C語言中,結構體是一種資料結構,是C提供的聚合型別(C提供了兩種聚合型別:陣列和結構)的一種。結構體與陣列的區別是:陣列是相同型別的集合,而結構體可能具有不同的型別。 結構體也可以被宣告為變數,陣列或者指標等,用以實現較複雜的

Unity使用NDK在Android平臺上引用C++程式碼的so檔案(上)

這是我的第一篇博文,在我剛開始實現本文功能是的,感悟真的是挺深的,為了給大家分享我的探索經驗也為了以後自己方便查閱,寫下此篇博文學習一種新的東西,一定要從最簡單的開始,把一切需要實現的功能做到最容易實現的地步,比如說引用外部一個方法,就要把這個方法做到最簡單,比如說這個方法沒

android平臺打印C語言日誌

as2 使用 pri 2.0 tag bug logs .com 3-9 在android平臺打印C語言日誌 1、操作平臺:AS2.0 2、步驟如下: 在C代碼中添加如下代碼: #define LOG_TAG "我的C語言日誌:" #define LOGD(...) _

Android平臺調用c++

jni小白:java代碼中,為什麽不能直接寫c或c++代碼?而oc代碼卻可以直接寫! 小程:你可以寫,只是編譯不過而已。 小白:那不就是不能寫嘛! 不管是編譯到jvm,還是dalvik上運行,java的編譯器都不會直接生成執行文件,而只是生成字節碼(表現為class文件,或者是經過轉換的dex文件),這跟c

C++虛擬函式表以及記憶體文章

C++虛擬函式表以及記憶體對齊文章 C++ 物件的記憶體佈局(上) https://blog.csdn.net/haoel/article/details/3081328 C++ 物件的記憶體佈局(下) https://blog.csdn.net/haoel/article/deta

C++11 記憶體 alignof alignas

一 現象 先看一段程式碼: struct s1 { char s; int i; }; struct s2 { int i; double d; }; cout << "-------basic type" << endl; c

C語言結構體(記憶體問題)

C語言結構體對齊也是老生常談的話題了。基本上是面試題的必考題。內容雖然很基礎,但一不小心就會弄錯。寫出一個struct,然後sizeof,你會不會經常對結果感到奇怪?sizeof的結果往往都比你宣告的變數總長度要大,這是怎麼回事呢?     開始學的時候,

C語言查缺補漏(七)結構體記憶體原則

忽略點七:結構體記憶體對齊原則 ​ 直到前幾個星期做了一道選擇題才知道,結構體元素的宣告順序可能影響結構體使用時所需的記憶體大小!!! ​ 一查才知道,在C語言中結構體有記憶體對齊原則,這個原則可以總結為兩點: ——資料成員對齊規則: ​ 結構體或聯合體的資料

C/C++ 記憶體原則及作用

struct/class/union記憶體對齊原則有四個: 1).資料成員對齊規則:結構(struct)(或聯合(union))的資料成員,第一個資料成員放在offset為0的地方,以後每個資料成員儲存的起始位置要從該成員大小或者成員的子成員大小(只要該成員有子成員,比

c++記憶體的問題

#include <iostream> typedef class { public: struct { int b; int c; }a; struct { bool e; char f; }d;

C語言中的struct——記憶體

sizeof計算結構體大小的時候具體是怎樣計算的 記憶體對齊的原則是根據最寬資料型別的大小進行對齊的 struct A { char a; 1+1 short b; 2 int c; 4 }; 大小是8個位元組 要進行記憶體對齊,是

C++中什麼是記憶體

以下資料是我從別人的文章抽取出來的,我認為比較有利於理解。加上一點我的理解     接下來我們好好討論一下記憶體對齊的作用   1.平臺原因(移植原因):不是所有的硬體平臺都能訪問任意地址上的任意資料,某些硬體平臺只能在某些地址處取某些特定型別的資料,否則丟擲硬體異常

【易錯】C語言結構體記憶體問題

對於一個結構體的位元組數大家有沒有遇到什麼疑問呢? 先看一個結構體: typedef struct Test { char a1; int a2; char a3; short a4; }Test_T; 在32位編譯系統下這一個結構體的位元組數是多少呢?是1+4

c語言記憶體與#pragma pack(n)

一、什麼是記憶體對齊,為什麼要記憶體對齊  現在計算機記憶體空間都是按照byte位元組劃分的,理論上講對任何型別的變數的訪問可以從任何地址開始,但實際情況是在訪問特定型別變數的時候經常在特定的記憶體地址上訪問,這就需要各種資料型別按照一定的規則在空間上排列,而不是一個接一個

C進階之:記憶體

什麼是記憶體對齊?  記憶體對齊可以用一句話來概括:  “資料項只能儲存在地址是資料項大小的整數倍的記憶體位置上”。例如int型別佔用4個位元組,地址只能在0,4,8等位置上。  不同型別的資料在記憶體中按照一定的規則排列,而不一定是順序的一個接一個的排列,這就是所謂的