色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

關(guān)于C程序中10個(gè)與內(nèi)存有關(guān)的常見錯(cuò)誤

Dp1040 ? 來(lái)源:一起學(xué)嵌入式 ? 2023-06-20 10:41 ? 次閱讀

與內(nèi)存有關(guān)的錯(cuò)誤,屬于那種最令人驚恐的錯(cuò)誤。在時(shí)間和空間上,經(jīng)常在距離錯(cuò)誤源一段距離之后才表現(xiàn)出來(lái)。將錯(cuò)誤的數(shù)據(jù)寫到錯(cuò)誤的位置,你的程序可能在最終失敗之前運(yùn)行了一段時(shí)間。

下面列舉并分析了與內(nèi)存有關(guān)的幾種錯(cuò)誤:

1、間接引用壞指針

如果間接引用一個(gè)指向沒(méi)有任何意義的數(shù)據(jù)的指針,那么操作系統(tǒng)會(huì)以段異常終止程序。如果向只讀區(qū)域中寫入數(shù)據(jù),這些區(qū)域會(huì)以保護(hù)異常終止這個(gè)程序。

一個(gè)常見的經(jīng)典示例是scanf錯(cuò)誤。這個(gè)函數(shù)用處是從標(biāo)準(zhǔn)輸入讀入一個(gè)整數(shù)到一個(gè)變量,正確的寫法是傳遞給scanf一個(gè)格式串和變量的地址:

scanf("%d", &value);

然而,常見的書寫錯(cuò)誤如下:

scanf("%d", value);

這種情況下,scanf將把value內(nèi)容解釋為一個(gè)地址,并試圖將一個(gè)字寫到這個(gè)位置。這會(huì)導(dǎo)致程序出現(xiàn)異常,有時(shí)會(huì)立即終止;有時(shí)會(huì)在相當(dāng)長(zhǎng)的時(shí)間后造成災(zāi)難性、令人困惑的后果。

2、讀未初始化的內(nèi)存

常見的錯(cuò)誤是假設(shè)堆內(nèi)存被初始化為零:

int *matvec(int **A, int *x, int n)
{
int i, j;
int *y = (int *)malloc(n * sizeof(int));

for(i = 0; i < n; i++)
????{
????????for(j = 0; j < n; j++)
????????{
????????????y[i] += A[i][j] * x[j]
????????}
????}
????return y;
}
示例中不應(yīng)該假設(shè)新申請(qǐng)的內(nèi)存地址(y指向的地址)被初始化為零;正確的做法是顯式地將y[i]設(shè)置為零,或者使用calloc申請(qǐng)內(nèi)存。

3、棧緩沖區(qū)溢出

如果一個(gè)程序不檢查輸入字符串的大小就寫入棧中目標(biāo)緩沖區(qū),那么這個(gè)程序就會(huì)出現(xiàn)緩沖區(qū)溢出的錯(cuò)誤,如下程序:

void buff()
{
char buf[64];

gets(buf);
return;
}
這個(gè)函數(shù)會(huì)出現(xiàn)緩沖區(qū)溢出錯(cuò)誤,因?yàn)間ets函數(shù)只是簡(jiǎn)單復(fù)制一個(gè)任意長(zhǎng)度的字符串到緩沖區(qū),不限制輸入串的大小。解決這個(gè)問(wèn)題的方法是,可以用限制了輸入串大小的fgets函數(shù)。

4、假設(shè)指針和它們指向的對(duì)象大小相同

常見的錯(cuò)誤是,假設(shè)指向?qū)ο蟮闹羔樅退鼈兯赶虻膶?duì)象是相同大小的,示例程序:

int **makeArray(int n, int m)
{
int i;
int **A = (int **)malloc(n * sizeof(int)); /* 注意此處語(yǔ)句,存在問(wèn)題 */

for(i = 0; i < n; i++)
????{
????????A[j] = (int *)malloc(m * sizeof(int));
????}
????return A;
}
此程序的目的是創(chuàng)建一個(gè)由n個(gè)指針組成的數(shù)組,每個(gè)指針都指向一個(gè)包含m個(gè)int的數(shù)組。然而,第4行程序代碼將sizeof(int *)寫成了sizeof(int),代碼實(shí)際上創(chuàng)建的是一個(gè)int的數(shù)組。

這段代碼只有在int和指向int的指針大小相同的機(jī)器上運(yùn)行良好,否則就會(huì)出現(xiàn)錯(cuò)誤。

5、內(nèi)存越界

這種錯(cuò)誤會(huì)越界覆蓋原有內(nèi)存的數(shù)據(jù),導(dǎo)致出錯(cuò):

int **makeArray(int n, int m)
{
int i;
int **A = (int **)malloc(n * sizeof(int)); /* 注意此處語(yǔ)句,存在問(wèn)題 */

for(i = 0; i <= n; i++) /* 注意循環(huán)終止條件 */
????{
????????A[j] = (int *)malloc(m * sizeof(int));
????}
????return A;
}
程序在第6行和第8行試圖初始化這個(gè)數(shù)組的n+1個(gè)元素,這個(gè)過(guò)程會(huì)覆蓋A數(shù)組后面的某個(gè)內(nèi)存位置。

6、引用指針,而不是它所指向的對(duì)象

如果不太注意C操作符的優(yōu)先級(jí)和結(jié)合性,我們就會(huì)錯(cuò)誤地操作指針,而不是指針?biāo)赶虻膶?duì)象。如果想要減少某個(gè)指針指向的整數(shù)的值,代碼書寫如下:

*ptr--;

然而,因?yàn)橐辉\(yùn)算符“--”和“*”的優(yōu)先級(jí)相同,且從右向左結(jié)合。那么上述代碼實(shí)際的效果為*(ptr--),即減少的是指針自己的值,而不是它所指向的整數(shù)的值。

如果對(duì)優(yōu)先級(jí)和結(jié)合性有疑問(wèn)的時(shí)候,就用括號(hào)。修正后的代碼如下:

(*ptr)--;

7、誤解指針運(yùn)算

這類錯(cuò)誤是忘記指針的算術(shù)運(yùn)算操作是如何進(jìn)行,是以指針指向的對(duì)象的大小為單位進(jìn)行的,而這種大小單位并不一定是字節(jié)。 例如,掃描一個(gè)int的數(shù)組,并返回一個(gè)指向val首次出現(xiàn)的指針:

int *search(int *p, int val)
{
while(*p && *p != val)
{
p += sizeof(int);
}
return p;
}
每次循環(huán)時(shí),第5行都把指針加了4(一個(gè)整數(shù)的字節(jié)數(shù)),函數(shù)就不正確地掃描了數(shù)組中每4個(gè)整數(shù)。

8、引用不存在的變量

有的C程序員不太理解棧的規(guī)則,有時(shí)會(huì)引用不再合法的局部變量,如下所示:

int *stackref()
{
int val;

return &val;
}

這個(gè)函數(shù)返回一個(gè)指針(假設(shè)為ptr),指向棧里的一個(gè)局部變量,然后彈出它的棧幀。盡管ptr仍然指向一個(gè)合法的內(nèi)存地址,但它已經(jīng)不再指向一個(gè)合法的變量了。

以后在程序中調(diào)用其他函數(shù)時(shí),內(nèi)存將重用它們的棧幀。如果程序賦值給*ptr,那么它可能實(shí)際上正在修改另一個(gè)含的棧幀中的數(shù)據(jù),從而潛在地帶來(lái)災(zāi)難性的后果。

9、引用空閑堆塊中的數(shù)據(jù)

引用已經(jīng)被釋放了的堆塊中的數(shù)據(jù)會(huì)導(dǎo)致出錯(cuò)。例如:

int *heapref(int n, int m)
{
int i;
int *x, *y;

x = (int *)malloc(n * sizeof(int)); /* 申請(qǐng)內(nèi)存 */

...

free(x); /* 釋放內(nèi)存 */

y = (int *)malloc(m * sizeof(int));
for(i = 0; i < m; i++)
????{
????????y[i] = x[i]++;
????}

????return y;
}

當(dāng)程序在第15行引用x[i]時(shí),數(shù)組x可能已經(jīng)是某個(gè)其他已分配堆塊的一部分了,其內(nèi)容也許被重寫了。導(dǎo)致程序運(yùn)行結(jié)果與預(yù)期不符合,出現(xiàn)錯(cuò)誤。

10、引起內(nèi)存泄漏

內(nèi)存泄漏是緩慢、隱形的殺手,當(dāng)程序員不小心忘記釋放已分配的內(nèi)存塊,而在堆里創(chuàng)建了垃圾時(shí),會(huì)發(fā)生這種問(wèn)題。如下:

void leak(int n)
{
int *x = (int *)malloc(n * sizeof(int));

return;
}
如果經(jīng)常調(diào)用這個(gè)函數(shù),漸漸地堆里會(huì)充滿了垃圾,造成內(nèi)存泄漏。另外,有時(shí)也會(huì)引起程序終止或其他問(wèn)題。

小結(jié)

以上總結(jié)了C程序中,管理和使用內(nèi)存常見的錯(cuò)誤類型,并舉例進(jìn)行了說(shuō)明。在實(shí)際的編程中,應(yīng)該避免出現(xiàn)這些錯(cuò)誤,否則會(huì)出現(xiàn)意想不到的后果。





審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • C語(yǔ)言
    +關(guān)注

    關(guān)注

    180

    文章

    7614

    瀏覽量

    137438
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    CC++語(yǔ)言開發(fā)內(nèi)存直接操作的方法

    指針釋放引起的錯(cuò)誤:釋放同一個(gè)內(nèi)存塊兩次,或釋放一塊未曾使用malloc分配的內(nèi)存,或釋放仍在使用內(nèi)
    的頭像 發(fā)表于 05-09 10:56 ?9078次閱讀
    在<b class='flag-5'>C</b>和<b class='flag-5'>C</b>++語(yǔ)言開發(fā)<b class='flag-5'>中</b><b class='flag-5'>內(nèi)存</b>直接操作的方法

    FPGA設(shè)計(jì)中經(jīng)常犯的10個(gè)錯(cuò)誤

    本文列出了FPGA設(shè)計(jì)中常見的十個(gè)錯(cuò)誤。我們收集了 FPGA 工程師在其設(shè)計(jì)犯的 10 個(gè)
    發(fā)表于 05-31 15:57 ?1230次閱讀
    FPGA設(shè)計(jì)中經(jīng)常犯的<b class='flag-5'>10</b><b class='flag-5'>個(gè)</b><b class='flag-5'>錯(cuò)誤</b>

    C程序常見的與內(nèi)存相關(guān)的錯(cuò)誤

    對(duì)C語(yǔ)言入門程序員來(lái)說(shuō),管理和使用虛擬存儲(chǔ)器可能是個(gè)困難的,容易出錯(cuò)的任務(wù)。與存儲(chǔ)器有關(guān)錯(cuò)誤屬于那些最令人驚恐的
    發(fā)表于 06-14 17:13 ?372次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>程序</b>中<b class='flag-5'>常見</b>的與<b class='flag-5'>內(nèi)存</b>相關(guān)的<b class='flag-5'>錯(cuò)誤</b>

    C程序10個(gè)內(nèi)存有關(guān)常見錯(cuò)誤

    內(nèi)存有關(guān)錯(cuò)誤,屬于那種最令人驚恐的錯(cuò)誤。在時(shí)間和空間上,經(jīng)常在距離錯(cuò)誤源一段距離之后才表現(xiàn)出來(lái)。將錯(cuò)誤的數(shù)據(jù)寫到
    發(fā)表于 06-20 10:41 ?716次閱讀

    【原創(chuàng)】常見內(nèi)存錯(cuò)誤及對(duì)策

    校驗(yàn)也起不了作用,沒(méi)有被 初始化的指針變量,內(nèi)部是一個(gè)非NULL的亂碼assert是一個(gè)宏,而不是函數(shù),包含在assert.h頭文件。如果其后面括號(hào)里的值為假,則程序終 止運(yùn)行,并提
    發(fā)表于 08-24 11:34

    動(dòng)態(tài)內(nèi)存錯(cuò)誤的靜態(tài)檢測(cè)

    內(nèi)存泄漏、空指針引用等動(dòng)態(tài)內(nèi)存錯(cuò)誤在/,/LL等支持動(dòng)態(tài)內(nèi)存操作的程序普遍存在在
    發(fā)表于 06-10 16:29 ?52次下載
    動(dòng)態(tài)<b class='flag-5'>內(nèi)存</b><b class='flag-5'>錯(cuò)誤</b>的靜態(tài)檢測(cè)

    糾正10個(gè)有關(guān)編程的常見誤區(qū)

    在編程行業(yè),一直流傳著很多誤區(qū)。下面讓我們一起來(lái)糾正10個(gè)有關(guān)編程的常見誤區(qū),以幫助編程初學(xué)者或有志成為程序員的人,更理性地認(rèn)識(shí)編程。
    的頭像 發(fā)表于 02-02 16:02 ?3387次閱讀

    關(guān)于NAND閃存有哪些觀念是錯(cuò)誤的?

    在半導(dǎo)體業(yè),有非常多與接口標(biāo)準(zhǔn)、性能規(guī)格、功能特性和設(shè)計(jì)的真實(shí)可能性有關(guān)聯(lián)的假設(shè)、術(shù)語(yǔ)和誤解。因此,弄清事實(shí)很重要。本文將闡明關(guān)于NAND閃存的錯(cuò)誤觀念。
    發(fā)表于 08-30 14:39 ?961次閱讀

    虛擬內(nèi)存有什么用

    虛擬內(nèi)存有什么用?雖說(shuō)內(nèi)存的大小會(huì)直接影響我們電腦的運(yùn)行的程序個(gè)數(shù)和運(yùn)行速度,但是當(dāng)內(nèi)存的容量剩余很少的時(shí)候,再運(yùn)行電腦程序的時(shí)候,電腦就會(huì)
    的頭像 發(fā)表于 03-14 14:55 ?1.4w次閱讀

    關(guān)于PCBA設(shè)計(jì)10個(gè)常見錯(cuò)誤介紹

    排名前10位的PCBA錯(cuò)誤設(shè)計(jì)要避免 ,這里列出了10個(gè)常見錯(cuò)誤,以及如何輕松避免這些
    的頭像 發(fā)表于 02-27 10:20 ?2348次閱讀

    C語(yǔ)言常見內(nèi)存錯(cuò)誤及解決方法

      本文將帶您了解一些良好的和內(nèi)存相關(guān)的編碼實(shí)踐,以將內(nèi)存錯(cuò)誤保持在控制范圍內(nèi)。內(nèi)存錯(cuò)誤C
    的頭像 發(fā)表于 02-14 13:10 ?3351次閱讀

    關(guān)于C語(yǔ)言的10個(gè)技巧

    硬件工程師最常見的工作內(nèi)容是通過(guò)寫代碼來(lái)測(cè)試硬件。這10個(gè)C語(yǔ)言技巧(C語(yǔ)言仍然是常見的選擇)可
    發(fā)表于 10-18 09:10 ?726次閱讀

    C程序常見的與內(nèi)存相關(guān)的錯(cuò)誤及其解決辦法

    對(duì)C語(yǔ)言入門程序員來(lái)說(shuō),管理和使用虛擬存儲(chǔ)器可能是個(gè)困難的,容易出錯(cuò)的任務(wù)。
    的頭像 發(fā)表于 06-14 17:13 ?1174次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>程序</b>中<b class='flag-5'>常見</b>的與<b class='flag-5'>內(nèi)存</b>相關(guān)的<b class='flag-5'>錯(cuò)誤</b>及其解決辦法

    常用的解決內(nèi)存錯(cuò)誤的方法

    1. 內(nèi)存管理功能問(wèn)題 由于C++語(yǔ)言對(duì)內(nèi)存有主動(dòng)控制權(quán),內(nèi)存使用靈活和效率高,但代價(jià)是不小心使用就會(huì)導(dǎo)致以下內(nèi)存
    的頭像 發(fā)表于 11-10 15:29 ?1555次閱讀
    常用的解決<b class='flag-5'>內(nèi)存</b><b class='flag-5'>錯(cuò)誤</b>的方法

    ug內(nèi)部錯(cuò)誤內(nèi)存訪問(wèn)違例怎么解決

    ug內(nèi)部錯(cuò)誤內(nèi)存訪問(wèn)違例怎么解決 內(nèi)部錯(cuò)誤內(nèi)存訪問(wèn)違例是編程中常見的問(wèn)題,它們可能會(huì)導(dǎo)致應(yīng)用程序
    的頭像 發(fā)表于 12-27 16:27 ?6531次閱讀
    主站蜘蛛池模板: 国产一区二区在线观看免费 | a三级黄色片| 久久99精品久久久久久园产越南 | 亚洲国产在线精品第二剧情不卡 | 国产成人精品自线拍 | 欧美亚洲日韩国产在线在线 | 漂亮的保姆6在线观看中文 漂亮的保姆5电影免费观看完整版中文 | 2019夜夜 | 久久re热在线视频精6 | 成人无码精品一区二区在线观看 | YELLOW视频在线观看大全 | 日韩精品 电影一区 亚洲高清 | 欧美亚洲精品午夜福利AV | 国产成人aaa在线视频免费观看 | 99re久久热在线播放快 | 三男强一女90分钟在线观看 | 国产乱码二卡3卡四卡 | 亚洲日韩精品AV中文字幕 | 亚洲中文字幕无码一久久区 | 人妻激情综合久久久久蜜桃 | 天天操狠狠操夜夜操 | 日本一区二区三区在线观看网站 | 色AV色婷婷96人妻久久久 | 甜性涩爱下载 | 免费无码又爽又黄又刺激网站 | 黑人巨大两根一起挤进欧美 | 99免费在线观看视频 | 国产精品成人免费观看 | 久久精品国产首叶 | 医生含着我的奶边摸边做 | 国产精品久久久久久无码专区 | 被免费网站在线视频 | 超碰在线97久久视频观看 | 色婷婷综合久久久久中文一区二区 | 亚洲熟妇无码乱子AV电影 | 男女作爱在线播放免费网页版观看 | 欧洲亚洲精品A片久久99果冻 | 国产强奷糟蹋漂亮邻居在线观看 | 精品久久伊人 | 色视频色露露永久免费观看 | 午夜阳光影院在线观看视频 |