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