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

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

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

C語言內(nèi)存操作有哪些陷進(jìn)

Q4MP_gh_c472c21 ? 來源:搜狐網(wǎng) ? 作者:搜狐網(wǎng) ? 2020-09-22 14:45 ? 次閱讀

1、返回局部變量的地址,或者返回指向局部變量的指針

int *stackref()

{

int val;

return &val;

}

2、引用已經(jīng)被釋放了的堆內(nèi)存(野指針)

int * heapref(int n, int m)

{

int i;

int *x, *y;

x = (int *)malloc(n * sizeof(int));

/* 各種操作 */

free(x);

x = NULL;

y = (int *)malloc(m * sizeof(int));

for(i = 0; i 《 m; i++) {

y[i] = x[i]++; // 此處的x之前已經(jīng)被釋放了!

}

}

3、內(nèi)存泄漏

malloc和free沒有配套使用

void leak(int n)

{

int *x = (int *)malloc(n * sizeof(int));

return;

}

或者:

char *p = (char *)malloc(10);

p = (char *)malloc(10);

結(jié)構(gòu)體資源釋放常見內(nèi)存泄漏問題

struct a{

int buf_size;

char *buf;

};

struct a *p = (struct *a)malloc(sizeof(struct a));

忘記給成員buf分配空間就使用

釋放的時(shí)候,忘記釋放buf

先釋放了p,再釋放buf

free(p);

free(p-》buf);

多步驟內(nèi)存初始化

char *buf1;

char *buf2;

int module_init()

{

buf1 = (char *)malloc(100);

if(buf1 == NULL)

return -1;

buf2 = (char *)malloc(100);

if(buf2 == NULL)

return -1;//執(zhí)行到這里,buf1內(nèi)存泄漏

free(buf2);

free(buf1);

。..

}

解決對(duì)策是對(duì)出錯(cuò)處理修改成goto語句,而非直接return。

調(diào)用了會(huì)分配內(nèi)存的函數(shù),使用完未做內(nèi)存回收處理。

實(shí)際開發(fā)最常見,常常是調(diào)用會(huì)分配內(nèi)存的第三方函數(shù)庫。

char *func ( )

{

return (char *)malloc(20); // make sure to memset this location to ‘’…

}

void callingFunc ( )

{

char * p = func ( ); // Problem lies here

。..

}

4、棧越界

{

char buf[5];

sprintf(buf, “%s”, “hello world”);

}

上面的代碼導(dǎo)致棧緩沖區(qū)溢出,安全的做法是:

1)根據(jù)需求定義合適的buffer;

2)采用snprintf(buf, sizeof(buf), “%s”, “hello world”)來及時(shí)截?cái)唷?/p>

5、誤認(rèn)為從堆分配的內(nèi)存被初始化為0

int *p = malloc(24 * sizeof(int));

char a[] = “abcdefghiafa”;

int i = 0;

while(a[i] != ‘’)

{

i++;

p[*a - ‘a(chǎn)’]++;

}

6、引用未初始化的指針,或者訪問NULL指針

int *p;

int a = *p;

7、間接訪問無效地址,類似于引用未初始化的指針

如從stdin讀取一個(gè)int變量時(shí),scanf(“%d”, &val);是正確用法,若誤寫為scanf(“%d”, val);時(shí),val的值會(huì)被解釋為一個(gè)地址,并試圖向該地址寫數(shù)據(jù)。在最好的情況下,進(jìn)程立即異常中止。在最壞的情況下,val的值恰好對(duì)應(yīng)于虛擬存儲(chǔ)器的某個(gè)合法的具有讀/寫權(quán)限的內(nèi)存區(qū)域,于是該內(nèi)存單元會(huì)被改寫,而這通常會(huì)在相當(dāng)長的一段時(shí)間后造成災(zāi)難性的、令人困惑的后果。

8、堆越界

char *p = (char *)malloc(10);

char *q = (char *)malloc(10);

char a[20] = “abcdefghijklmno”

memcpy(p,a,sizeof(a));//可能無意中修改了q指針指向的堆數(shù)據(jù)

9、謹(jǐn)慎使用strcpy,memcpy等拷貝函數(shù),字符串?dāng)?shù)組賦值之前或者定義之后最好memset一下

char p[10];

strcpy(p,“hello world!”);//數(shù)組越界

strncpy(p,“hello world!”,sizeof(p));//不越界,但是少了結(jié)尾‘’

memset(p,‘’,sizeof(p));

strncpy(p,“hello world!”,sizeof(p) - 1);//正確

10、使用未初始化的內(nèi)存

char *p = (char *)malloc(10);

char a[10] = “abcd”;

strcpy(a,p);//結(jié)果未知

11、當(dāng)使用malloc來申請(qǐng)內(nèi)存時(shí),應(yīng)該用if(p != NULL)進(jìn)行防錯(cuò)檢查。

12、意圖通過傳遞指針來分配內(nèi)存

void *GetMemory(void *p,int n)

{

p = malloc(n);

return p;

}

char *p;

GetMemory((void *)p,10);

*p = ‘a(chǎn)’;

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

    關(guān)注

    180

    文章

    7595

    瀏覽量

    135923

原文標(biāo)題:C語言內(nèi)存操作的陷阱!你踩過坑嗎?

文章出處:【微信號(hào):gh_c472c2199c88,微信公眾號(hào):嵌入式微處理器】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    關(guān)于C語言結(jié)構(gòu)體內(nèi)存對(duì)齊

    今天給大家?guī)硪坏澜?jīng)典、易錯(cuò)的關(guān)于C語言結(jié)構(gòu)體內(nèi)存對(duì)齊的題目:
    的頭像 發(fā)表于 04-14 12:51 ?6843次閱讀

    關(guān)于C語言結(jié)構(gòu)體內(nèi)存對(duì)齊

    今天給大家?guī)硪坏澜?jīng)典、易錯(cuò)的關(guān)于C語言結(jié)構(gòu)體內(nèi)存對(duì)齊的題目。
    發(fā)表于 09-08 11:54 ?464次閱讀

    一文詳解C語言內(nèi)存管理

    C語言內(nèi)存管理指對(duì)系統(tǒng)內(nèi)存的分配、創(chuàng)建、使用這一系列操作
    發(fā)表于 07-26 16:04 ?671次閱讀
    一文詳解<b class='flag-5'>C</b><b class='flag-5'>語言</b><b class='flag-5'>內(nèi)存</b>管理

    小數(shù)在內(nèi)存中是如何存儲(chǔ)的?為什么C語言中的浮點(diǎn)數(shù)不支持位移操作?

    小數(shù)在內(nèi)存中是如何存儲(chǔ)的?為什么C語言中的浮點(diǎn)數(shù)不支持位移操作
    發(fā)表于 08-16 09:24 ?985次閱讀
    小數(shù)在<b class='flag-5'>內(nèi)存</b>中是如何存儲(chǔ)的?為什么<b class='flag-5'>C</b><b class='flag-5'>語言</b>中的浮點(diǎn)數(shù)不支持位移<b class='flag-5'>操作</b>?

    C語言中數(shù)組和結(jié)構(gòu)體的內(nèi)存表示和布局

    C語言中,數(shù)組和結(jié)構(gòu)體都可以代表一塊內(nèi)存,但為什么結(jié)構(gòu)體可以直接賦值,而數(shù)組不可以?這個(gè)問題涉及到C語言的設(shè)計(jì)哲學(xué)、語法規(guī)則以及
    發(fā)表于 08-28 10:54 ?1402次閱讀

    C語言中的動(dòng)態(tài)內(nèi)存管理知識(shí)

    概述:C語言的優(yōu)勢是可以直接訪問內(nèi)存地址,也就是指針操作,但其缺陷也是因?yàn)橹苯?b class='flag-5'>內(nèi)存訪問。如何通過防御性編程提前發(fā)現(xiàn)問題,盡可能減少
    發(fā)表于 09-22 09:54 ?453次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言</b>中的動(dòng)態(tài)<b class='flag-5'>內(nèi)存</b>管理知識(shí)

    C語言的底層操作

    原因,那就是C語言對(duì)底層操作做了很多的的支持,提供了很多比較底層的功能。   下面結(jié)合問題分別進(jìn)行闡述。   問題:移位操作   在運(yùn)用移位操作
    發(fā)表于 04-23 11:56

    C語言教程之獲取BIOS常規(guī)內(nèi)存容量

    C語言教程之獲取BIOS常規(guī)內(nèi)存容量,很好的C語言資料,快來學(xué)習(xí)吧。
    發(fā)表于 04-25 16:43 ?0次下載

    C語言的sizeof操作符基礎(chǔ)和經(jīng)典問題

    C語言中,sizeof是一個(gè)操作符(operator),而不是函數(shù)!其用于判斷數(shù)據(jù)類型或者表達(dá)式長度(所占的內(nèi)存字節(jié)數(shù))。其兩種表達(dá)形式
    的頭像 發(fā)表于 04-04 17:39 ?2649次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言</b>的sizeof<b class='flag-5'>操作</b>符基礎(chǔ)和經(jīng)典問題

    單片機(jī)C語言C語言為什么差異?

    許多小伙伴在學(xué)完C語言后想入門單片機(jī),但學(xué)著學(xué)著發(fā)現(xiàn)明明都是C語言,為什么單片機(jī)C語言和我當(dāng)初學(xué)
    發(fā)表于 09-01 16:39 ?3733次閱讀

    不同環(huán)境下C語言操作

    目錄一.C語言知識(shí)回顧篇二.不同環(huán)境下運(yùn)行C語言代碼一.C語言知識(shí)回顧篇1.
    發(fā)表于 01-13 15:30 ?2次下載
    不同環(huán)境下<b class='flag-5'>C</b><b class='flag-5'>語言</b>的<b class='flag-5'>操作</b>

    C語言內(nèi)存問題如何解決

    大家好,我是雜燴君。 C 語言內(nèi)存問題,難在于定位,定位到了就好解決了。 這篇筆記我們來聊聊踩內(nèi)存。踩內(nèi)存,通過字面理解即可。本來是
    的頭像 發(fā)表于 06-22 11:37 ?428次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言</b><b class='flag-5'>內(nèi)存</b>問題如何解決

    聊聊嵌入式C語言內(nèi)存的問題

    C 語言內(nèi)存問題,難在于定位,定位到了就好解決了。
    發(fā)表于 06-25 08:59 ?1545次閱讀
    聊聊嵌入式<b class='flag-5'>C</b><b class='flag-5'>語言</b>踩<b class='flag-5'>內(nèi)存</b>的問題

    嵌入式C語言高手煉成之內(nèi)存操作

    在嵌入式系統(tǒng)的編程中,常常要求在特定的內(nèi)存單元讀寫內(nèi)容,匯編對(duì)應(yīng)的MOV指令,而除C/C++以外的其它編程語言基本沒有直接訪問絕對(duì)地址的能
    的頭像 發(fā)表于 12-11 17:20 ?480次閱讀

    C語言內(nèi)存泄漏問題原理

    內(nèi)存泄漏問題只有在使用堆內(nèi)存的時(shí)候才會(huì)出現(xiàn),棧內(nèi)存不存在內(nèi)存泄漏問題,因?yàn)闂?b class='flag-5'>內(nèi)存會(huì)自動(dòng)分配和釋放。C
    發(fā)表于 03-19 11:38 ?455次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言</b><b class='flag-5'>內(nèi)存</b>泄漏問題原理