日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

通过零长度的数组获取结构体大小

發布時間:2025/5/22 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 通过零长度的数组获取结构体大小 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

為什么80%的碼農都做不了架構師?>>> ??

mysize.c

#include <stdio.h> #include <stdlib.h>struct S {int a;double b;char s[0]; };int main(int argc, char *argv[]) {struct S *size = NULL;printf("%d\n", size->s);printf("sizeof(struct S) = %d\n", sizeof(struct S));return 0; }

輸出:

16 sizeof(struct S) = 16

gdb 調試信息

### BEGIN LOG - DATE: 170616, TIME: 195749 ###gdb ./mysize GNU gdb 6.6 Copyright (C) 2006 Free Software Foundation, Inc. GDB is free software, covered by the GNU General Public License, and you are welcome to change it and/or distribute copies of it under certain conditions. Type "show copying" to see the conditions. There is absolutely no warranty for GDB. Type "show warranty" for details. This GDB was configured as "x86_64-suse-linux"... Using host libthread_db library "/lib64/libthread_db.so.1". (gdb) l 3 4 struct S { 5 int a; 6 double b; 7 char s[0]; 8 }; 9 10 int main(int argc, char *argv[]) 11 { 12 struct S *size = NULL; (gdb) l 13 printf("%d\n", size->s); 14 15 printf("sizeof(struct S) = %d\n", sizeof(struct S)); 16 return 0; 17 } (gdb) b 12 Breakpoint 1 at 0x400507: file mysize.c, line 12. (gdb) r Starting program: /data/home/shenhontang/test/tsh_code/mysize/mysize Failed to read a valid object file image from memory. [Thread debugging using libthread_db enabled] [New Thread 139774018967248 (LWP 4527)] [Switching to Thread 139774018967248 (LWP 4527)]Breakpoint 1, main (argc=1, argv=0x7fff69e43f28) at mysize.c:12 12 struct S *size = NULL; (gdb) s 13 printf("%d\n", size->s); (gdb) p size $1 = (struct S *) 0x0 (gdb) p size->a Cannot access memory at address 0x0 (gdb) p size->b Cannot access memory at address 0x8 (gdb) p size->s $2 = 0x10 <Address 0x10 out of bounds> (gdb) s 16 15 printf("sizeof(struct S) = %d\n", sizeof(struct S)); (gdb) s sizeof(struct S) = 16 16 return 0; (gdb) s 17 } (gdb) quit The program is running. Exit anyway? (y or n) y### END LOG - DATE: 170616, TIME: 200119 ###

系統為 64bit linux 系統

指針和數組的差別有了上面的基礎后,你把源代碼中的struct str結構體中的char s[0];改成char *s;試試看,你會發現,在13行if條件的時候,程序因為Cannot access memory就直接掛掉了。為什么聲明成char s[0],程序會在14行掛掉,而聲明成char *s,程序會在13行掛掉呢?那么char *s 和 char s[0]有什么差別呢?在說明這個事之前,有必要看一下匯編代碼,用GDB查看后發現:?對于char s[0]來說,匯編代碼用了lea指令,lea 0x04(%rax), %rdx?對于char*s來說,匯編代碼用了mov指令,mov 0x04(%rax), %rdxlea全稱load effective address,是把地址放進去,而mov則是把地址里的內容放進去。所以,就crash了。從這里,我們可以看到,訪問成員數組名其實得到的是數組的相對地址,而訪問成員指針其實是相對地址里的內容(這和訪問其它非指針或數組的變量是一樣的)換句話說,對于數組 char s[10]來說,數組名 s 和 &s 都是一樣的(不信你可以自己寫個程序試試)。

參考:?http://coolshell.cn/articles/11377.html

轉載于:https://my.oschina.net/tsh/blog/974033

總結

以上是生活随笔為你收集整理的通过零长度的数组获取结构体大小的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 91本色 | 免费看黄色aaaaaa 片 | 欧美理伦片在线播放 | 香蕉视频官方网站 | 成人第四色 | 99久久99久久精品国产片桃花 | 综合色吧 | 国产精品免费看片 | 波多野结衣在线免费视频 | 国产又黄又粗又长 | 一道本在线播放 | 一级片av | 韩国19主播内部福利vip | 天天做夜夜做 | 精品一区二区在线观看视频 | 日韩欧美亚洲成人 | 黄页网址大全免费观看 | 国产视频在线观看一区 | 97狠狠| 亚洲男人的天堂在线视频 | 日韩在线观看视频一区二区三区 | 免费观看h片| 亚洲第一成人在线 | 97精品熟女少妇一区二区三区 | 爱爱爱爱网 | 亚洲国产成人在线视频 | 欧美在线播放视频 | 黄色一几片 | 国产综合视频一区二区 | 亚洲超碰在线 | 久久bb| 欧美在线视频免费播放 | 亚洲网站免费观看 | 日韩久久精品视频 | 欧美午夜精品 | 欲色av| 久久一级电影 | 久久久综合色 | 国产黄色小视频在线观看 | 国产精品无码久久久久成人app | 国产精品成人一区二区三区电影毛片 | 午夜诱惑痒痒网 | 亚洲人在线观看视频 | 欧美一区二区高清视频 | 亚洲欧洲一区二区三区 | 一本一道av无码中文字幕 | 美女天天干 | 天天插天天爱 | 97se在线视频| 超碰操| 特黄在线| 成人网页在线观看 | 无码国产69精品久久久久网站 | 91热久久 | exo妈妈mv在线播放高清免费 | 久久大胆| 美女啪啪网址 | 激情小说亚洲色图 | 中文字幕欧美视频 | 日日日干干干 | 国产精品丝袜黑色高跟鞋 | www.色欧美 | 国产一二视频 | 中文字幕伦理 | 男人天堂2024 | 丰满人妻一区二区三区在线 | 波多野结衣有码 | 欧美123区 | 18禁裸男晨勃露j毛免费观看 | 成人毛片18女人毛片免费 | 日本精品一区视频 | 男女啊啊啊 | 黄色av网站免费看 | 嫩草视频 | 久久久久久久久福利 | 亚洲天堂精品在线 | 久久久久一区 | 中文字幕无码日韩专区免费 | 国产视频第一页 | 久草一本 | 亚洲成人生活片 | 国产熟女一区二区三区四区 | 国产 日韩 欧美 制服丝袜 | 欧美日韩在线国产 | 国产精品无码一区 | 亚洲国产丝袜 | 97av在线视频 | 日韩视频一区二区在线观看 | 国产精品精品 | 三级黄色在线播放 | 日日夜夜艹 | 奇米第四色影视 | 日韩小视频在线 | 国产精品一区二区入口九绯色 | 日日干天天射 | 操人在线观看 | 不卡日本 | 亚洲激情视频网 | 青青草综合网 |