1. 程式人生 > >C/C++搞不懂指標還是陣列?用sizeof解釋struct大小!

C/C++搞不懂指標還是陣列?用sizeof解釋struct大小!

陣列?指標?

聽說c++打算廢棄指標了,誰讓指標這麼難呢!

我的環境:

>uname -a
CYGWIN_NT-10.0-WOW DESKTOP-499IG24 2.10.0(0.325/5/3) 2018-02-02 15:21 i686 Cygwin

可見為32bit核心,也就是指標所佔空間的sizeof為4.

那麼這段程式:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

/*main函式*/
int main(int argc, char**argv)
{
    char s1[] = "abcdefg";
    char s2[] = {'a','b','c','d','e','f','g'};
    char s3[] = {"abcdefg"};
    char *s4 = "abcdefg";
    //char *s5 = {'a','b','c','d','e','f','g'};//error
    char *s6 = {"abcdefg"};
    
    printf("s:%s, length:%2d, sizeof:%2d\n",s1,strlen(s1),sizeof(s1));
    printf("s:%s, length:%2d, sizeof:%2d\n",s2,strlen(s2),sizeof(s2));
    printf("s:%s, length:%2d, sizeof:%2d\n",s3,strlen(s3),sizeof(s3));
    printf("s:%s, length:%2d, sizeof:%2d\n",s4,strlen(s4),sizeof(s4));
    //printf("s:%s, length:%2d, sizeof:%2d\n",s5,strlen(s5),sizeof(s5));//error
    printf("s:%s, length:%2d, sizeof:%2d\n",s6,strlen(s6),sizeof(s6));
    
    s1[0] = 'z';
    s2[0] = 'z';
    s3[0] = 'z';
    //s4[0] = 'z';//error
    //s5[0] = 'z';//error
    //s6[0] = 'z';//error
    
    return 1;
}

的輸出為:

>gcc string.c
>a.exe
s:abcdefg, length: 7, sizeof: 8
s:abcdefgabcdefg, length:14, sizeof: 7
s:abcdefg, length: 7, sizeof: 8
s:abcdefg, length: 7, sizeof: 4
s:abcdefg, length: 7, sizeof: 4

那麼這幾個的sizeof為什麼不一樣呢?

32bit系統核心的指標大小為4,後面的兩個4不難解釋,上面的兩個8可以解釋為自動補齊(類似於struct,struct是按照最大位元組數補齊),而大小為7的則是對應的陣列。

sizeof(結構體)

一下均採用如下程式列印:

printf("%d+%d+%d+%d = %d\n",
        sizeof(int),sizeof(char),sizeof(float),sizeof(double),sizeof(S));

需要搞明白的是struct的自動對齊機制:

例1:

struct{
    int a;
    char ch;
    float f;
    double d;
}S;

輸出結果為:

>gcc string.c
>a.exe
4+1+4+8 = 24


例2:

struct{
    int a;
    char ch;
    float f;
}S;

結果:

>gcc string.c
>a.exe
4+1+4+8 = 12


例3:

struct{
    float f;
    double d;
}S;

結果:

>gcc string.c
>a.exe
4+1+4+8 = 16


例4:

struct{
    int a;
    double d;
}S;

結果:

>gcc string.c
>a.exe
4+1+4+8 = 16

相關推薦

C/C++指標還是陣列sizeof解釋struct大小

陣列?指標?聽說c++打算廢棄指標了,誰讓指標這麼難呢!我的環境:>uname -a CYGWIN_NT-10.0-WOW DESKTOP-499IG24 2.10.0(0.325/5/3) 2018-02-02 15:21 i686 Cygwin可見為32bit核心,

你的月亮我的C(六):指標陣列的那些事

先來看幾個問題,一邊從問題中入手,一邊看看指標和陣列之間的那些事: 1、char arr[ ]和char *arr是等價的嗎? 答:不是。看下指標和陣列的定義:陣列是一個用同一型別的多個連續元素組成的事先分配好的記憶體塊。指標是一個可以對任何資料元素的引用。所以陣列的定義

昨天,游標能夠跟隨了,不過系統呼叫能正常工作,沒找到原因,暫時也,就這樣吧

/************************************************************************/ /* Macros Declaration

救救孩子吧,到現在TCP的三次握手四次揮手

> 本文在個人技術部落格同步釋出,詳情可[**用力戳**](https://www.17coding.info/article/33) > 亦可掃描螢幕右側二維碼關注個人公眾號,公眾號內有個人聯絡方式,等你來撩...   前幾天發了一個朋友圈,發現暗戀已久的女生給我點了個贊,於是我

TF-的TF矩陣加法

其中 oat int 矩陣 ssi p12 谷歌 conv2 eval 看谷歌的demo mnist,卷積後加偏執量的代碼 h_conv1 = tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1)h_pool1 = max_pool_

的github

介紹 老師 git .com 自己 簡單的 都得 hub post 我也是在網上看了不少的教程,但還是一臉懵逼。首先還是先寫出自己的github的地址吧。我的github地址為:https://github.com/UchinoMENG.這個網址裏面還是有一些東西的,但都是

據說,80%的人都雜湊演算法 區塊鏈 雜湊演算法

本文約9000字+,閱讀(觀看)需要52分鐘 聊到區塊鏈的時候也少不了會聽到“雜湊”、“雜湊函式”、“雜湊演算法”,是不是聽得一頭霧水?別急,這一講我們來講講什麼是雜湊演算法。 雜湊是一種加密演算法 雜湊函式(Hash Function),也稱為雜湊函式或雜湊函式。雜湊函式是一個

Python 正則表示式,實戰篇? 算我輸~

整理自: Automate the Boring Stuff with Python 作者: Al Sweigart 1. 建立正則表示式物件和匹配Regex物件 向 re.compile() 傳入一個字串值,表示正則表示式,它將返回一個 Regex

那些年的高深術語——依賴倒置•控制反轉•依賴注入•面向介面程式設計

那些年,空氣中彷彿還能聞到漢唐盛世的餘韻,因此你決不允許自己的臉上有油光,時刻保持活力。然而,你一定曾為這些“高深術語”感到過困擾——依賴倒置•控制反轉•依賴注入•面向介面程式設計。也許時至今日,你仍對它們一知半解。不過就在今天,這一切都將徹底改變!我將帶領你以一種全新的

想學習大數據卻Hadoop?阿裏雲工程師帶你三步解讀Hadoop

大數 網易 挖掘 支持 文件存儲 規模 淘寶 階段 設計 一、什麽是Hadoop? Google發表了兩篇論文:描述如何以分布式方式存儲海量數據的Google文件系統和描述如何處理大規模分布式數據的MapReduce:大型集群上的簡化數據處理。受這兩篇論文的啟發,DougC

【當你以備課的心態去學習,沒有你的內容】首篇

    今天是悶熱的一天 太陽見不到 但是空氣乾燥而且讓人喘不過來氣。     8:00到圖書館 剛剛踏進有絲絲的清涼 但是隨著電梯的升高 氣溫也升了起來 是我太久沒有來過的原因麼?為何圖書館沒有了空調。     上午看了作業系統和離散數學的網易視訊,收益匪淺,但是ege圖

為什麼你精通CRUD,卻資料庫的基本原理?

原創宣告 本文作者:黃小斜 轉載請務必在文章開頭註明出處和作者。 本文思維導圖 ​ 資料庫和關係型資料庫 作為一個程式設計師,不瞭解資料庫怎麼能行,那麼資料庫到底是個啥呢,作為一個Java工程師,平時和資料庫打交道著實不少,所謂的CRUD其實就是對資料庫進行增刪改查的操作。 根據百度百科的介紹,資料庫是

雙向連結串列都Redis?

目錄 redis原始碼分析系列文章 前言 API使用 lpush左側插入資料 rpush右側插入資料 刪除某個資料 修改某個資料 具體邏輯圖 雙向連結串列的定義 節點ListNode 整體架構 雙向連結串列的實現 建立表頭 清空表 新增元素到表頭 新增元素到表尾 插入 刪除 總結 redis原始碼分析系列文

聽說同學你Java的LinkedHashMap,可笑

先看再點贊,給自己一點思考的時間,微信搜尋【沉默王二】關注這個有顏值卻假裝靠才華苟且的程式設計師。本文 GitHub github.com/itwanger 已收錄,裡面還有我精心為你準備的一線大廠面試題。 同學們好啊,還記得 HashMap 那篇嗎?我自己感覺寫得非常棒啊,既通俗易懂,又深入原始碼,

C語言精要總結-內存地址對齊與struct大小判斷篇

超過 等於 合規 占用 編譯 約定 long 並發 分享 在筆試時,經常會遇到結構體大小的問題,實際就是在考內存地址對齊。在實際開發中,如果一個結構體會在內存中高頻地分配創建,那麽掌握內存地址對齊規則,通過簡單地自定義對齊方式,或者調整結構體成員的順序,可以有效地減少內存使

挖比特幣浪費電?你比特幣挖礦背後的真相

挖比特幣,費電。 眾所周知。 以目前通用的螞蟻礦機s9i為例。 實打實的1365瓦,具體跑起來的話只會更誇張。平均每天耗電35度電左右。 來自去年的資料,比特幣挖礦在2017年的實時耗電量已經佔到全球總耗電量的0.5%,並且已超越了159個國家的耗電量。下面這

Java反射,和鹹魚有什麼區別啊

Java反射的功能非常之強大,能夠深入的理解其思想,對自己的開發能力將有非常大的提高。 反射概述 Reflection(反射)是Java被視為動態語言的關鍵,反射機制允許程式在執行期藉助於Reflection API取得任何類的內部資訊,並能直接操作任意物件的內

聽說你PS手動描邊Python摳圖只需五秒PS了

  昨日,byteq 開發人員 Benjamin Groessing 在 twitter 上釋出了一款基於 PythonPython、Ruby 的深度學習工具 remove.bg。該工具可在 5 秒內移除影象背景(目前侷限於有人物的影象),其在影象處理過程中使用了多種自定義演算法。

擴充套件、接管MVC都會,Spring Boot?

持續原創輸出,點選上方藍字關注我 目錄 前言Spring Boot 版本如何擴充套件MVC?如何自定義一個攔截器?什麼都不配置為什麼依然能執行MVC相關的功能?如何全面接管MVC?【不推薦】為什麼@EnableWebMvc一個註解就能夠全面接管MVC?Spring Boot相關資料總結 前言 自從用了S

一文C/C++中指標那些事(上篇)

一 指標變數 1.間接存取        指標變數的值為地址;普通變數的值為資料;其中“*”為指標運算子。&是地址操作符,用來引用一個記憶體地址。通過在變數名字前使用&操作符,我們可以得到該變數的記憶體地址。        針對記憶體資料的