linux c 指针和内存分配内存,linux-C基础系列-内存管理(野指针).md
野指針概述
野指針通常指的是指針變量中保存的值不會死一個合法的內存地址,但又對其訪問。需要注意的是野指針不是空指針,而是指向內存不可用的指針。
C語言中對于空指針(NULL)是可以判斷出來的,但是野指針是無法判斷一個非空指針是否為野指針。
野指針一般的來源如下:
局部指針變量沒有初始化
#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;
}
指針所指向的內存空間在使用前被銷毀
#include
char *fun()
{
char p[] = "haha";
return p;
}
int main()
{
char *p = fun();
printf("%s\n",p); // 野指針
return 0;
}
指針經典錯誤
①被指向的變量沒有初始化
②沒有為指針指向的內存分配足夠的內存
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;
}
內存分配成功但沒有初始化
#include
#include
int main()
{
char *s = (char *)malloc(10);
printf("%s\n",s); // 字符串以 '\0' 為結束符,如不初始化,則未知 '\0'在哪。
free(s);
return 0;
}
數組越界
#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;
}
內存泄漏
void fun(unsigned int size)
{
int *p = malloc(sizeof(int) * size);
int i;
if(size % 2 != 0){
return ; // 未釋放已申請的內存
}
for(i = 0; i < size ;i++){
p[i] = i;
printf("%d\n",p[i]);
}
free(p);
}
此處可表明,函數設計時最好是單入口單出口。
多次對指針進行內存釋放
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;
}
此處可以表明在進行內存操作時,其原則是“誰申請,誰釋放”,并且在釋放后對指針置空。
使用已釋放的指針
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; // 內存空間已釋放
}
return 0;
}
內存使用一般規則
① 使用malloc等申請內存后,必須立即檢查返回值是否為NULL;
② 牢記數組長度,防止越界操作,可考慮使用柔性數組;
③ 內存申請和釋放操作必須匹配,防止內存泄漏也可防止多次釋放;
④ 如必須在某個函數中釋放一個內存,則建議添加一個參數選項,來顯式提醒調用者是否釋放內存;
⑤ free后立即將其賦值為NULL,因為free的參數為空時是合法參數;
email: MingruiZhou@outlook.com
總結
以上是生活随笔為你收集整理的linux c 指针和内存分配内存,linux-C基础系列-内存管理(野指针).md的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: html怎么在字体中加波浪线,CSS3实
- 下一篇: 使用mockjs模拟数据