指針強制類型轉換觸發內存自動對齊

C語言的指針是我們操作很靈活,但是也留下了不少坑,今天工作遇到了一個指針的坑,這里復現一下:

   指針類型強制轉換,并進行解引用,引起的內存對齊問題.

(一)問題復現:

運行環境:Ubuntu 16.04

#include <stdio.h>int main(void)
{char cTestBuffer[10] = {0,1,2,3,4,5,6,7,8,9};char *pcData = &cTestBuffer[5];int  iDest =0;int  i=0;for(i=0;i<10;i++){printf("cTestBuffer[%d]=0x%08x\n",i,&cTestBuffer[i]);}printf("pcData指針地址=0x%08x\n",pcData);iDest = *(int *)pcData;printf("iDest實際值=0x%08x\niDest期望值=0x%02x%02x%02x%02x\n",iDest,pcData[3],pcData[2],pcData[1],pcData[0]);}
            ^
root@virtual-machine:~/test# ./a.out 
cTestBuffer[0]=0x3139ca70
cTestBuffer[1]=0x3139ca71
cTestBuffer[2]=0x3139ca72
cTestBuffer[3]=0x3139ca73
cTestBuffer[4]=0x3139ca74
cTestBuffer[5]=0x3139ca75
cTestBuffer[6]=0x3139ca76
cTestBuffer[7]=0x3139ca77
cTestBuffer[8]=0x3139ca78
cTestBuffer[9]=0x3139ca79
pcData指針地址=0x3139ca75
iDest實際值=0x08070605
iDest期望值=0x08070605
root@lvirtual-machine:~/test# 

(二)問題解析:

我這里使用的編譯器并沒有任何問題,在我自己的電腦無論如何都復現不了該問題,該問題可能有的編譯器進行了優化,所以我們看不到現象,但是當我們進行指針強制類型轉換時要注意字節對齊,當我們對char指針類型轉換為ULONG類型時,在賦值操作采用memcpy進行操作,否則可能出現意想不到的錯誤

這篇文章中樓主復現了該問題:C語言,指針強制類型轉換與內存對齊

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/531343.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/531343.shtml
英文地址,請注明出處:http://en.pswp.cn/news/531343.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

簡單文本編輯器

一、前言 聚天地之靈氣&#xff0c;集日月之精華&#xff01;一個簡單的java文本編輯器由此而生。畢設所需&#xff0c;很是無奈&#xff01; 二、界面預覽 三、實現思路 1.字體選擇器的實現 (1).字體類 class MyFont{private Font font;private Color color;public Font getFo…

u-boot新增命令后出現data abort

&#xff08;一&#xff09;問題描述 u-boot下新增了一條update的命令&#xff0c;直接輸入update沒有報錯&#xff0c;但是輸入up按TAB鍵補全時發現出現data abort&#xff0c;而且輸入不支持的命令也會有data abort &#xff08;二&#xff09;解決方法 最開始我包含的頭…

sublime text學習

Ctrl / ---------------------注釋 Ctrl 滾動 --------------字體變大/縮小 Ctrl N-------------------新建 軟件右下角可以選擇文檔語法模式 Ctrl Shift P ------------------命令模式 命令&#xff1a; sshtml模糊匹配-----語法切換到html模式&#xff0c;同理所得&am…

core文件如何分析

目錄(一&#xff09;什么是coredump(二)coredump產生的條件&#xff08;1&#xff09;coredump產生主要原因&#xff1a;&#xff08;2&#xff09;如何生成coredump(三&#xff09;gdb使用(四&#xff09;實例調試coredump文件(五&#xff09;總結(一&#xff09;什么是coredu…

SpringMVC+FreeMarker

前言&#xff1a; 最近在學習SpringMVC&#xff0c;模板引擎用的是FreeMarker&#xff0c;之前沒有接觸過。利用SpringMVC開發其實還有許多的步驟&#xff0c;比如控制層&#xff0c;服務層&#xff0c;持久化層&#xff0c;實體等等&#xff0c;先弄了一個小demo來總結一下Spr…

SpringMVC那點事

一、SpringMVC返回json數據的三種方式 1、第一種方式是spring2時代的產物&#xff0c;也就是每個json視圖controller配置一個Jsoniew。 如&#xff1a;<bean id"defaultJsonView" class"org.springframework.web.servlet.view.json.MappingJacksonJsonView&q…

js學習內容的整理

1、jquery動態添加Table中的一行 function addTableRow(tableId){var html <tr>\......\</tr>";//行首插入一行if($(#tableId).find(tr).length 1){$(html).insertAfter($(#tableId).find(tr).eq(0));} else { $(html).insertBefore($(#tableId).find(tr).e…

(一)最鄰近插值python實現

這里寫目錄標題&#xff08;一&#xff09;原始圖像&#xff08;二&#xff09;最鄰近插值實現&#xff08;三&#xff09;python實現1. 安裝庫2. python程序編寫3. 效果4. 工程文件&#xff08;一&#xff09;原始圖像 &#xff08;二&#xff09;最鄰近插值實現 一般情況下我…

(二)雙線性插值python實現

這里寫目錄標題&#xff08;一&#xff09;原始圖像&#xff08;二&#xff09;雙線性插值原理&#xff08;三&#xff09;python實現1. 安裝庫2. python程序編寫3. 效果4. 工程文件&#xff08;一&#xff09;原始圖像 &#xff08;二&#xff09;雙線性插值原理 一般情況下我…

js self = this的解釋

Demo 1: function Person(){this.name hjzgg;this.age 24;this.show function(){alert(name " " age);}}var p new Person();p.show(); 錯誤&#xff1a;name 和 age都沒有定義。 Demo 2: function Person(){this.name hjzgg;this.age 24;this.show functio…

(三)圖像轉灰度圖Python實現

這里寫目錄標題&#xff08;一&#xff09;原始圖像&#xff08;二&#xff09;轉換原理&#xff08;三&#xff09;python實現1. 安裝庫2. python程序編寫3. 效果4. 工程文件&#xff08;一&#xff09;原始圖像 &#xff08;二&#xff09;轉換原理 &#xff08;三&#xff…

SD卡實例分析fat32文件系統

目錄 環境描述 分析過程 1.SD卡格式化 2.使用winhex打開sd卡 3.MBR分析 4.DBR分析

java泛型上下限

前言&#xff1a; java的泛型上下限不是很好理解&#xff0c;尤其像我這種菜雞。反反復復看了好幾遍了...&#xff0c;真是... 一、簡單的繼承體系 class Person{}class Student extends Person{}class Worker extends Person{} 二、泛型上限&#xff08;extends 關鍵字&#x…

基于matlab的步進電機仿真(一)

這里寫目錄標題環境準備基礎準備模型參數輸入和輸出仿真原理圖仿真資源環境準備 MatLab2021b 基礎準備 打開Matlab&#xff0c;在幫助文檔里面搜索step motor,我們這里選擇如下模型 該模型實現了一個通用的步進電機模型&#xff1a; 可變磁阻步進電機永磁或混合步進電機 …

java自定義類加載器

前言 java反射&#xff0c;最常用的Class.forName()方法。做畢設的時候&#xff0c;接收到代碼字符串&#xff0c;通過 JavaCompiler將代碼字符串生成A.class文件&#xff08;存放在classpath下&#xff0c;也就是eclipse項目中的bin目錄里&#xff09;&#xff0c;然后通過jav…

常用網址

MDN : 一個不錯的前端學習網站 https://developer.mozilla.org/zh-CN/  https://developer.mozilla.org/en-US/ CodePen 是一個網站前端設計開發平臺&#xff0c;是一個針對網站前端代碼設計的開發工具。 RunJS - 在線編輯、展示、分享、交流你的 JavaScript 代碼 : http://r…

repo介紹(一)

repo簡介 Repo 是我們以 Git 為基礎構建的代碼庫管理工具,可以組織多個倉庫的上傳和下載。它是由一系列的Python腳本組成&#xff0c;封裝了一系列的Git命令&#xff0c;用來統一管理多個Git倉庫 一個大型的項目可能由很多小的倉庫組合而成的&#xff0c;為了方便統一管理各個…

hash長度擴展攻擊

作為一個信息安全的人&#xff0c;打各個學校的CTF比賽是比較重要的&#xff01; 最近一個朋友發了道題目過來&#xff0c;發現有道題目比較有意思&#xff0c;這里跟大家分享下 這串代碼的大致意思是&#xff1a; 這段代碼首先引入了一個名為"flag.php"的文件&am…

repo介紹(二)

這篇文章來實例操作 安裝repo&#xff0c;參考repo介紹這一節創建repo存放default.xml 的git倉庫 初始化repo&#xff0c;repo init -u https://gitee.com/angerial/repo-test.git 這個時候會在當前目錄生成如下文件 參考repo組成&#xff0c;修改.repo/manifest.xml,這里我的…

springmvc環境搭建以及常見問題解決

1.新建maven工程 a) 打開eclipse&#xff0c;file->new->project->Maven->Maven Project b) 下一步 c) 選擇創建的工程為webapp&#xff0c;下一步 d) 填寫項目的group id和artifact id。一般情況下&#xff0c;group id寫域名的倒序&#xff0c;artifact id…