在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

C語言內存操作有哪些陷進

Q4MP_gh_c472c21 ? 來源:搜狐網 ? 作者:搜狐網 ? 2020-09-22 14:45 ? 次閱讀

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

int *stackref()

{

int val;

return &val;

}

2、引用已經被釋放了的堆內存(野指針)

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之前已經被釋放了!

}

}

3、內存泄漏

malloc和free沒有配套使用

void leak(int n)

{

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

return;

}

或者:

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

p = (char *)malloc(10);

結構體資源釋放常見內存泄漏問題

struct a{

int buf_size;

char *buf;

};

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

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

釋放的時候,忘記釋放buf

先釋放了p,再釋放buf

free(p);

free(p-》buf);

多步驟內存初始化

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;//執行到這里,buf1內存泄漏

free(buf2);

free(buf1);

。..

}

解決對策是對出錯處理修改成goto語句,而非直接return。

調用了會分配內存的函數,使用完未做內存回收處理。

實際開發最常見,常常是調用會分配內存的第三方函數庫。

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”);

}

上面的代碼導致棧緩沖區溢出,安全的做法是:

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

2)采用snprintf(buf, sizeof(buf), “%s”, “hello world”)來及時截斷。

5、誤認為從堆分配的內存被初始化為0

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

char a[] = “abcdefghiafa”;

int i = 0;

while(a[i] != ‘’)

{

i++;

p[*a - ‘a’]++;

}

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

int *p;

int a = *p;

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

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

8、堆越界

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

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

char a[20] = “abcdefghijklmno”

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

9、謹慎使用strcpy,memcpy等拷貝函數,字符串數組賦值之前或者定義之后最好memset一下

char p[10];

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

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

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

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

10、使用未初始化的內存

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

char a[10] = “abcd”;

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

11、當使用malloc來申請內存時,應該用if(p != NULL)進行防錯檢查。

12、意圖通過傳遞指針來分配內存

void *GetMemory(void *p,int n)

{

p = malloc(n);

return p;

}

char *p;

GetMemory((void *)p,10);

*p = ‘a’;

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • C語言
    +關注

    關注

    180

    文章

    7630

    瀏覽量

    140520

原文標題:C語言內存操作的陷阱!你踩過坑嗎?

文章出處:【微信號:gh_c472c2199c88,微信公眾號:嵌入式微處理器】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦
    熱點推薦

    關于C語言結構體內存對齊

    今天給大家帶來一道經典、易錯的關于C語言結構體內存對齊的題目:
    的頭像 發表于 04-14 12:51 ?7026次閱讀

    關于C語言結構體內存對齊

    今天給大家帶來一道經典、易錯的關于C語言結構體內存對齊的題目。
    發表于 09-08 11:54 ?607次閱讀

    一文詳解C語言內存管理

    C語言內存管理指對系統內存的分配、創建、使用這一系列操作
    發表于 07-26 16:04 ?837次閱讀
    一文詳解<b class='flag-5'>C</b><b class='flag-5'>語言</b><b class='flag-5'>內存</b>管理

    小數在內存中是如何存儲的?為什么C語言中的浮點數不支持位移操作

    小數在內存中是如何存儲的?為什么C語言中的浮點數不支持位移操作
    發表于 08-16 09:24 ?1266次閱讀
    小數在<b class='flag-5'>內存</b>中是如何存儲的?為什么<b class='flag-5'>C</b><b class='flag-5'>語言</b>中的浮點數不支持位移<b class='flag-5'>操作</b>?

    C語言中數組和結構體的內存表示和布局

    C語言中,數組和結構體都可以代表一塊內存,但為什么結構體可以直接賦值,而數組不可以?這個問題涉及到C語言的設計哲學、語法規則以及
    發表于 08-28 10:54 ?2068次閱讀

    C語言中的動態內存管理知識

    概述:C語言的優勢是可以直接訪問內存地址,也就是指針操作,但其缺陷也是因為直接內存訪問。如何通過防御性編程提前發現問題,盡可能減少
    發表于 09-22 09:54 ?750次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言</b>中的動態<b class='flag-5'>內存</b>管理知識

    C語言的底層操作

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

    C語言教程之獲取BIOS常規內存容量

    C語言教程之獲取BIOS常規內存容量,很好的C語言資料,快來學習吧。
    發表于 04-25 16:43 ?0次下載

    C語言的sizeof操作符基礎和經典問題

    C語言中,sizeof是一個操作符(operator),而不是函數!其用于判斷數據類型或者表達式長度(所占的內存字節數)。其兩種表達形式
    的頭像 發表于 04-04 17:39 ?2910次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言</b>的sizeof<b class='flag-5'>操作</b>符基礎和經典問題

    單片機C語言C語言為什么差異?

    許多小伙伴在學完C語言后想入門單片機,但學著學著發現明明都是C語言,為什么單片機C語言和我當初學
    發表于 09-01 16:39 ?3940次閱讀

    不同環境下C語言操作

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

    C語言內存問題如何解決

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

    聊聊嵌入式C語言內存的問題

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

    嵌入式C語言高手煉成之內存操作

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

    C語言內存泄漏問題原理

    內存泄漏問題只有在使用堆內存的時候才會出現,棧內存不存在內存泄漏問題,因為棧內存會自動分配和釋放。C
    發表于 03-19 11:38 ?770次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言</b><b class='flag-5'>內存</b>泄漏問題原理
    主站蜘蛛池模板: 六月婷婷导航福利在线 | 成在线人视频免费视频 | 国产色爽女小说免费看 | 黄视频网站观看 | 特级全毛片 | 男人不识本站 | 手机看片日韩永久福利盒子 | 欧美网站在线 | 亚洲欧美日韩动漫 | 免费被黄网站在观看 | 亚洲一二 | 一区在线观看 | 免费视频爰爱太爽了 | 精品国产乱码一区二区三区 | 岛国大片在线 | www日| 日本黄色站 | 老逼影院 | 在线中文字幕一区 | 亚州人成网在线播放 | 在线免费观看你懂的 | 久久www免费人成高清 | 日本aaaa视频| 久久久午夜精品理论片 | 伊人久久大香线蕉资源 | 免费观看在线观看 | 一级做a免费视频 | 午夜啪| 中文字幕在线观看第一页 | 激情在线视频 | 国产激烈床戏无遮挡在线观看 | 六月丁香中文字幕 | 欧美三级网站 | 国产一级在线观看 | 久久99精品久久久久久久不卡 | 91福利国产在线观看网站 | 男人操女人免费 | 亚洲狠狠97婷婷综合久久久久 | 好爽毛片一区二区三区四区 | 亚洲国产七七久久桃花 | 一区二区免费看 |