c结构体里的数组与指针
生活随笔
收集整理的這篇文章主要介紹了
c结构体里的数组与指针
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
/*
訪問成員數組名事實上得到的是數組的相對地址。而訪問成員指針事實上是相對地址里的內容
*/
struct buf_str {int length;char buf[0]; };struct foo {buf_str* pbuf; };void test_funny() {foo f = {0};printf("%x\n", f.pbuf);printf("%x\n", &f.pbuf->length);printf("%x\n", &f.pbuf->buf);printf("%x\n", f.pbuf->buf); if (f.pbuf->buf) //沒有申請內存,可是能夠訪問相對地址,*數組名就是相對地址*{//printf(f.pbuf->buf); //crash,等價于printf("%s", f.pbuf->buf);指針的內容} }struct buf_str1 {int length;char *buf; };struct foo1 {buf_str1* pbuf; };void test_funny1() {foo1 f = {0};printf("%x\n", &f.pbuf->length);printf("%x\n", &f.pbuf->buf); //指針的相對地址。 和前面的比較。也和以下的比較printf("%x\n", f.pbuf->buf); //指針所指內容的地址,*訪問指針,就是訪問相對地址里面的內容* crashif (f.pbuf->buf) //crash, 訪問內容{printf(f.pbuf->buf);} }
/*關于長度為0的數組,柔性數組意義*/
/*第一個意義是,方便內存釋放。假設我們的代碼是在一個給別人用的函數中,你在里面做了二次內存分配,
并把整個結構體返回給用戶。用戶調用free能夠釋放結構體,可是用戶并不知道這個結構體內的成員
也須要free。所以你不能指望用戶來發現這個事。所以,假設我們把結構體的內存以及其成員要的內存
一次性分配好了,并返回給用戶一個結構體指針。用戶做一次free就能夠把全部的內存也給釋放掉。
訪問成員數組名事實上得到的是數組的相對地址。而訪問成員指針事實上是相對地址里的內容
*/
struct buf_str {int length;char buf[0]; };struct foo {buf_str* pbuf; };void test_funny() {foo f = {0};printf("%x\n", f.pbuf);printf("%x\n", &f.pbuf->length);printf("%x\n", &f.pbuf->buf);printf("%x\n", f.pbuf->buf); if (f.pbuf->buf) //沒有申請內存,可是能夠訪問相對地址,*數組名就是相對地址*{//printf(f.pbuf->buf); //crash,等價于printf("%s", f.pbuf->buf);指針的內容} }struct buf_str1 {int length;char *buf; };struct foo1 {buf_str1* pbuf; };void test_funny1() {foo1 f = {0};printf("%x\n", &f.pbuf->length);printf("%x\n", &f.pbuf->buf); //指針的相對地址。 和前面的比較。也和以下的比較printf("%x\n", f.pbuf->buf); //指針所指內容的地址,*訪問指針,就是訪問相對地址里面的內容* crashif (f.pbuf->buf) //crash, 訪問內容{printf(f.pbuf->buf);} }
/*關于長度為0的數組,柔性數組意義*/
/*第一個意義是,方便內存釋放。假設我們的代碼是在一個給別人用的函數中,你在里面做了二次內存分配,
并把整個結構體返回給用戶。用戶調用free能夠釋放結構體,可是用戶并不知道這個結構體內的成員
也須要free。所以你不能指望用戶來發現這個事。所以,假設我們把結構體的內存以及其成員要的內存
一次性分配好了,并返回給用戶一個結構體指針。用戶做一次free就能夠把全部的內存也給釋放掉。
(讀到這里,你一定會認為C++的封閉中的析構函數會讓這事easy和干凈非常多)
第二個原因是。這樣有利于訪問速度。
連續的內存故意于提高訪問速度,也故意于降低內存碎片。
(事實上。我個人認為也沒多高了,反正你跑不了要用做偏移量的加法來尋址)
*/
void test_funny2() {printf("buf_str size : %d\n", sizeof(buf_str));//只輸出4,零長度的數組是存在于結構體內的。可是不占結構體的sizeint buf_len = 10;////長度為0數組的使用方法buf_str* pBuf = (buf_str*)malloc(sizeof(buf_str) + sizeof(char)*(buf_len+1));//連續的內存pBuf->length = buf_len+1;memset(pBuf->buf, 'a', sizeof(char) * buf_len);pBuf->buf[buf_len] = '\0';printf("%d %s\n", pBuf->length, pBuf->buf);free(pBuf);//只釋放一次內存pBuf = NULL;//////正常的申請buf_str1* pBuf1 = (buf_str1*)malloc(sizeof(buf_str1)); (pBuf1->buf) = (char*)malloc(sizeof(char)*(buf_len+1)); //內存可能不連續。須要兩次釋放pBuf1->length = buf_len+1;memset(pBuf1->buf, 'a', sizeof(char) * buf_len);pBuf1->buf[buf_len] = '\0';printf("%d %s\n", pBuf1->length, pBuf1->buf);free(pBuf1->buf);free(pBuf1);pBuf = NULL; }原文來自于
http://coolshell.cn/articles/11377.html
僅僅只是提取了主要內容,并測驗
轉載于:https://www.cnblogs.com/liguangsunls/p/6791908.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的c结构体里的数组与指针的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python将JSON格式数据转换为SQ
- 下一篇: 数据 格式化 format