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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux c 指针和内存分配内存,linux-C基础系列-内存管理(野指针).md

發(fā)布時(shí)間:2023/12/10 linux 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux c 指针和内存分配内存,linux-C基础系列-内存管理(野指针).md 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

野指針概述

野指針通常指的是指針變量中保存的值不會死一個(gè)合法的內(nèi)存地址,但又對其訪問。需要注意的是野指針不是空指針,而是指向內(nèi)存不可用的指針。

C語言中對于空指針(NULL)是可以判斷出來的,但是野指針是無法判斷一個(gè)非空指針是否為野指針。

野指針一般的來源如下:

局部指針變量沒有初始化

#include

int main()

{

char *p;

strcpy(p,"haha"); // 野指針

return 0;

}

使用已釋放的指針

int main()

{

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

free(p);

*p = 1; // 野指針

return 0;

}

指針?biāo)赶虻膬?nèi)存空間在使用前被銷毀

#include

char *fun()

{

char p[] = "haha";

return p;

}

int main()

{

char *p = fun();

printf("%s\n",p); // 野指針

return 0;

}

指針經(jīng)典錯誤

①被指向的變量沒有初始化

②沒有為指針指向的內(nèi)存分配足夠的內(nèi)存

struct Demo

{

int *p;

}

int main()

{

struct Demo d1,d2;

int i;

for(i = 0; i < 10; i++){

d1.p[i] = i; // 未初始化

}

d2.p = (int *)calloc(5,sizeof(int));

for(i = 0; i < 10; i++){

d2.p[i] = i; // 越界,沒有分配足夠的空間

}

free(d2.p);

return 0;

}

內(nèi)存分配成功但沒有初始化

#include

#include

int main()

{

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

printf("%s\n",s); // 字符串以 '\0' 為結(jié)束符,如不初始化,則未知 '\0'在哪。

free(s);

return 0;

}

數(shù)組越界

#include

void fun(int a[10])

{

int i;

for(i = 0; i < 10 ;i++){

a[i] = i; // 越界

printf("%d\n",a[i]);

}

}

int main()

{

int a[5];

fun(a);

return 0;

}

內(nèi)存泄漏

void fun(unsigned int size)

{

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

int i;

if(size % 2 != 0){

return ; // 未釋放已申請的內(nèi)存

}

for(i = 0; i < size ;i++){

p[i] = i;

printf("%d\n",p[i]);

}

free(p);

}

此處可表明,函數(shù)設(shè)計(jì)時(shí)最好是單入口單出口。

多次對指針進(jìn)行內(nèi)存釋放

void fun(int *p,int size)

{

int i;

for(i = 0; i< size; i++){

p[i] = i;

printf("%d\n",p[i]);

}

free(p);

}

int main()

{

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

fun(p,5);

free(p); // 多次釋放

return 0;

}

此處可以表明在進(jìn)行內(nèi)存操作時(shí),其原則是“誰申請,誰釋放”,并且在釋放后對指針置空。

使用已釋放的指針

void fun(int *p,int size)

{

int i;

for(i = 0; i < size ;i++){

printf("%d\n",p[i]);

}

free(p);

}

int main()

{

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

int i = 0;

fun(p,5);

for(i = 0;i < 5 ; i++){

p[i] = i; // 內(nèi)存空間已釋放

}

return 0;

}

內(nèi)存使用一般規(guī)則

① 使用malloc等申請內(nèi)存后,必須立即檢查返回值是否為NULL;

② 牢記數(shù)組長度,防止越界操作,可考慮使用柔性數(shù)組;

③ 內(nèi)存申請和釋放操作必須匹配,防止內(nèi)存泄漏也可防止多次釋放;

④ 如必須在某個(gè)函數(shù)中釋放一個(gè)內(nèi)存,則建議添加一個(gè)參數(shù)選項(xiàng),來顯式提醒調(diào)用者是否釋放內(nèi)存;

⑤ free后立即將其賦值為NULL,因?yàn)閒ree的參數(shù)為空時(shí)是合法參數(shù);

email: MingruiZhou@outlook.com

總結(jié)

以上是生活随笔為你收集整理的linux c 指针和内存分配内存,linux-C基础系列-内存管理(野指针).md的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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