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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

c语言中指针往内存写值,C语言编程常见问题解答之指针和内存分配

發(fā)布時(shí)間:2025/4/16 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c语言中指针往内存写值,C语言编程常见问题解答之指针和内存分配 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

指針為C語言編程提供了強(qiáng)大的支持——如果你能正確而靈活地利用指針,你就可以直接切入問題的核心,或者將程序分割成一個(gè)個(gè)片斷。一個(gè)很好地利用了指針的程序會(huì)非常高效、簡潔和精致。

利用指針你可以將數(shù)據(jù)寫入內(nèi)存中的任意位置,但是,一旦你的程序中有一個(gè)野指針("wild”pointer),即指向一個(gè)錯(cuò)誤位置的指針,你的數(shù)據(jù)就危險(xiǎn)了——存放在堆中的數(shù)據(jù)可能會(huì)被破壞,用來管理堆的數(shù)據(jù)結(jié)構(gòu)也可能會(huì)被破壞,甚至操作系統(tǒng)的數(shù)據(jù)也可能會(huì)被修改,有時(shí),上述三種破壞情況會(huì)同時(shí)發(fā)生。

此后可能發(fā)生的事情取決于這樣兩點(diǎn):第一,內(nèi)存中的數(shù)據(jù)被破壞的程度有多大;第二,內(nèi)存中的被破壞的部分還要被使用多少次。在有些情況下,一些函數(shù)(可能是內(nèi)存分配函數(shù)、自定義函數(shù)或標(biāo)準(zhǔn)庫函數(shù))將立即(也可能稍晚一點(diǎn))無法正常工作。在另外一些情況下,程序可能會(huì)終止運(yùn)行并報(bào)告一條出錯(cuò)消息;或者程序可能會(huì)掛起;或者程序可能會(huì)陷入死循環(huán);或者程序可能會(huì)產(chǎn)生錯(cuò)誤的結(jié)果;或者程序看上去仍在正常運(yùn)行,因?yàn)槌绦驔]有遭到本質(zhì)的破壞。

值得注意的是,即使程序中已經(jīng)發(fā)生了根本性的錯(cuò)誤,程序有可能還會(huì)運(yùn)行很長一段時(shí)間,然后才有明顯的失常表現(xiàn);或者,在調(diào)試時(shí),程序的運(yùn)行完全正常,只有在用戶使用時(shí),它才會(huì)失常。

在C語言程序中,任何野指針或越界的數(shù)組下標(biāo)(out-of-bounds array subscript)都可能使系統(tǒng)崩潰。兩次釋放內(nèi)存的操作也會(huì)導(dǎo)致這種結(jié)果。你可能見過一些C程序員編寫的程序中有嚴(yán)重的錯(cuò)誤,現(xiàn)在你能知道其中的部分原因了。

有些內(nèi)存分配工具能幫助你發(fā)現(xiàn)內(nèi)存分配中存在的問題,例如漏洞(leak,見7.21),兩次釋放一個(gè)指針,野指針,越界下標(biāo),等等。但這些工具都是不通用的,它們只能在特定的操作系統(tǒng)中使用,甚至只能在特定版本的編譯程序中使用。如果你找到了這樣一種工具,試試看能不能用,因?yàn)樗転槟愎?jié)省許多時(shí)間,并能提高你的軟件的質(zhì)量。

指針的算術(shù)運(yùn)算是C語言(以及它的衍生體,例如C++)獨(dú)有的功能。匯編語言允許你對(duì)地址進(jìn)行運(yùn)算,但這種運(yùn)算不涉及數(shù)據(jù)類型。大多數(shù)高級(jí)語言根本就不允許你對(duì)指針進(jìn)行任何操作,你只能看一看指針指向哪里。

C指針的算術(shù)運(yùn)算類似于街道地址的運(yùn)算。假設(shè)你生活在一個(gè)城市中,那里的每一個(gè)街區(qū)的所有街道都有地址。街道的一側(cè)用連續(xù)的偶數(shù)作為地址,另一側(cè)用連續(xù)的奇數(shù)作為地址。如果你想知道River Rd.街道158號(hào)北邊第5家的地址,你不會(huì)把158和5相加,去找163號(hào);你會(huì)先將5(你要往前數(shù)5家)乘以2(每家之間的地址間距),再和158相加,去找River Rd.街道的168號(hào)。同樣,如果一個(gè)指針指向地址158(十進(jìn)制數(shù))中的一個(gè)兩字節(jié)短整型值,將該指針加3=5,結(jié) 果將是一個(gè)指向地址168(十進(jìn)制數(shù))中的短整型值的指針(見7.7和7.8中對(duì)指針加減運(yùn)算的詳細(xì)描述)。

街道地址的運(yùn)算只能在一個(gè)特定的街區(qū)中進(jìn)行,同樣,指針的算術(shù)運(yùn)算也只能在一個(gè)特定的數(shù)組中進(jìn)行。實(shí)際上,這并不是一種限制,因?yàn)橹羔樀乃阈g(shù)運(yùn)算只有在一個(gè)特定的數(shù)組中進(jìn)行才有意義。對(duì)指針的算術(shù)運(yùn)算來說,一個(gè)數(shù)組并不必須是一個(gè)數(shù)組變量,例如函數(shù)malloc()或calloc()的返回值是一個(gè)指針,它指向一個(gè)在堆中申請(qǐng)到的數(shù)組。

指針的說明看起來有些使人感到費(fèi)解,請(qǐng)看下例:

char *p;

上例中的說明表示,p是一個(gè)字符。符號(hào)“*”是指針運(yùn)算符,也稱間接引用運(yùn)算符。當(dāng)程序間接引用一個(gè)指針時(shí),實(shí)際上是引用指針?biāo)赶虻臄?shù)據(jù)。

在大多數(shù)計(jì)算機(jī)中,指針只有一種,但在有些計(jì)算機(jī)中,指向數(shù)據(jù)和指向函數(shù)的指針可以是不同的,或者指向字節(jié)(如char。指針和void *指針)和指向字的指針可以是不同的。這一點(diǎn)對(duì)sizeof運(yùn)算符沒有什么影響。但是,有些C程序或程序員認(rèn)為任何指針都會(huì)被存為一個(gè)int型的值,或者至少會(huì)被存為一個(gè)long型的值,這就無法保證了,尤其是在IBM PC兼容機(jī)上。

注意:以下討論與Macintosh或UNIX程序員無關(guān);

最初的IBM PC兼容機(jī)使用的處理器無法有效地處理超過16位的指針(人們對(duì)這種結(jié)論仍有爭議。16位指針是偏移量,見9.3中對(duì)基地址和偏移量的討論)。盡管最初的IBM PC機(jī)最終也能使用20位指針,但頗費(fèi)周折。因此,從一開始,基于IBM兼容機(jī)的各種各樣的軟件就試圖沖破這種限制。

為了使20位指針能指向數(shù)據(jù),你需要指示編譯程序使用正確的存儲(chǔ)模式,例如緊縮存儲(chǔ)模式。在中存儲(chǔ)模式下,你可以用20位指針指向函數(shù)。在大和巨存儲(chǔ)模式下,用20位指針既可以指向數(shù)據(jù),也可以指向函數(shù)。在任何一種存儲(chǔ)模式下,你都可能需要用到far指針(見7.18和7.19)。

基于286的系統(tǒng)可以沖破20位指針的限制,但實(shí)現(xiàn)起來有些困難。從386開始,IBM兼容機(jī)就可以使用真正的32位地址了,例如象MS-Windows和OS/2這樣一些操作系統(tǒng)就實(shí)現(xiàn)了這一點(diǎn),但MS—DOS仍未實(shí)現(xiàn)。

如果你的MS—DOS程序用完了基本內(nèi)存,你可能需要從擴(kuò)充內(nèi)存或擴(kuò)展內(nèi)存中分配更多的內(nèi)存。許多版本的編譯程序和函數(shù)庫都提供了這種技術(shù),但彼此之間有所差別。這些技術(shù)基本上是不通用的,有些能在絕大多數(shù)MS-DOS和MS-WindowsC編譯程序中使用,有些只能在少數(shù)特定的編譯程序中使用,還有一些只能在特定的附加函數(shù)庫的支持下使用。如果你手頭有能提供這種技術(shù)的軟件,你看一下它的文檔,以了解更詳細(xì)的信息。

7.1 什么是間接引用(indirection)?

對(duì)已說明的變量來說,變量名就是對(duì)變量值的直接引用。對(duì)指向變量或內(nèi)存中的任何對(duì)象的指針來說,指針就是對(duì)對(duì)象值的間接引用。如果p是一個(gè)指針,p的值就是其對(duì)象的地址;*p表示“使間接引用運(yùn)算符作用于p”,*p的值就是p所指向的對(duì)象的值。

*p是一個(gè)左值,和變量一樣,只要在*p的右邊加上賦值運(yùn)算符,就可改變*p的值。如果p是一個(gè)指向常量的指針,*p就是一個(gè)不能修改的左值,即它不能被放到賦值運(yùn)算符的左邊,請(qǐng)看下例:

例 7.1 一個(gè)間接引用的例子

#include int

main()

{

int i;

int * p ;

i = 5;

p = & i; / * now * p = = i * /

/ * %Pis described in FAQ VII. 28 * /

printf("i=%d, p=%P, * p= %d\n" , i, P, *p);

* p = 6; / * same as i = 6 * /

printf("i=%d, p=%P, * p= %d\n" , i, P, *P);

return 0; / * see FAQ XVI. 4 * / }

}

上例說明,如果p是一個(gè)指向變量i的指針,那么在i能出現(xiàn)的任何一個(gè)地方,你都可以用*p代替i。在上例中,使p指向i(p=&i)后,打印i或*p的結(jié)果是相同的;你甚至可以給*p賦值,其結(jié)果就象你給i賦值一樣。

C語言編程常見問題解答之指針和內(nèi)存分配.doc

下載Word文檔到電腦,方便收藏和打印[全文共2694字]

編輯推薦:

下載Word文檔

總結(jié)

以上是生活随笔為你收集整理的c语言中指针往内存写值,C语言编程常见问题解答之指针和内存分配的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 久草福利 | 特一级黄色片 | 乱lun合集男男高h | 国产农村妇女精品一区二区 | av日日操| 日韩在线观看一区二区 | 欧美日韩国产综合网 | 精品1卡二卡三卡四卡老狼 日韩三级网 | 看av网站 | 天天干夜夜操视频 | 污片在线看 | www欧美| 中文字幕亚洲欧美日韩 | 欧美精产国品一二三区 | 大学生av| 亚洲性综合网 | 少妇的激情| 鲁一鲁av | 狠狠爱成人 | 特级西西444www大精品视频 | 欧美成人a | 日本一区二区不卡在线 | 欧日韩不卡在线视频 | 国产精品无码久久久久高潮 | 日本色中色 | 欧美黄页在线观看 | 国产青青草在线 | 日韩色av | 色爽黄 | 人人干人人看 | 国精产品一区二区三区 | 美女扒开尿口让男人捅爽 | 男女那个视频 | 国产超碰在线观看 | 久久久精品影院 | 欧美性xxxx在线播放 | 黑人玩弄人妻一区二区三区四 | 黄色美女大片 | 天天干天天操天天玩 | 成人v精品蜜桃久一区 | 国产1区2区3区 | 狠狠人妻久久久久久综合 | 在线免费观看av网址 | 浪浪视频在线观看 | 国产精品高潮呻吟久久久久久 | 婷婷av一区二区三区 | 久久久中文字幕 | 国产精品久久精品三级 | 成人91网站| 毛片基地在线观看 | 操欧美美女 | 黄色成人av | 日韩成人在线观看视频 | 国产suv精品一区 | 丰满少妇在线观看网站 | 免费看一级片 | 色99999| 久久视频这里只有精品 | 日韩成人激情视频 | 日韩精品一区二区三区不卡在线 | 日韩av免费在线播放 | 久久亚洲一区 | 金8天国av| 五月天婷婷综合 | 丰满人妻熟妇乱偷人无码 | 米奇色| 日本在线视频中文字幕 | 日韩免费av网站 | 久久av一区二区三区亚洲 | 超碰人人人 | 久久综合日本 | 日韩精品一区二区在线观看 | 夏目彩春娇喘呻吟高潮迭起 | 妺妺窝人体色www在线小说 | 亚洲在线色 | 中文字幕91视频 | 精品国产99久久久久久宅男i | 亚洲一区在线免费观看 | 欧美少妇xxx | 久久精品久久久久久久 | 1000部啪啪 | 国产激情精品一区二区三区 | 黄色wwww| 中文字幕乱码人妻二区三区 | 亚洲影视中文字幕 | 另类国产 | 国产精品100| 国产日韩欧美一区二区东京热 | 精品国产乱码久久久久久郑州公司 | 91精品国产91久久久久久黑人 | 国产一区二区在 | 成人区人妻精品一区二区网站 | 偷拍老头老太高潮抽搐 | 粉嫩av一区二区 | 日韩欧美国产一区二区三区在线观看 | 国产内射一区二区 | 日本不卡高清视频 | 国产亚洲不卡 | 日韩一区二区三区四区五区六区 |