1.堆
在鍊錶中找接近4位元組的空間,發現
5位元組接近
4位元組,將
5位元組給程式。
2.靜態儲存區(編譯時就存在)
儲存全域性變數和靜態區域性變數
3.野指標**
1)區域性指標變數沒有初始化;
struct student
char* name;
int number;
int main()
struct student s; //------>未初始化。
strcpy(s.name, "delphi tang"); // oops!
s.number = 99;
return 0;
2)使用已釋放的指標
void func(char* p)
printf("%s\n", p);
free(p); //-------->釋放了指標
int main()
char* s = (char*)malloc(5);
strcpy(s, "delphi tang"); //記憶體越界
func(s);
printf("%s\n", s); // oops!
return 0;
3)指標指向的變數在指向前被銷毀
函式返回後,fun函式有可能 被釋放棧,s指向位置未知,就產生野指標
char* func()
char p = "delphi tang";
return p;
int main()
char* s = func();
printf("%s\n", s); // oops!
return 0;
4.非法記憶體操作例項
1)結構體未初始化
struct demo
int* p;
int main()
struct demo d1;
for(int i=0; i<10; i++)
d1.p[i] = 0; // oops!
結構體初始化方法
struct
a_stru
x;
memset(&x, 0, sizeof(x)) 或者
memset(&x, 0, sizeof(struct a_stru))
2)沒有為結構體指標分配足夠的記憶體(越界)
d2.p = (int*)calloc(5, sizeof(int));
for(i=0; i<10; i++)
d2.p[i] = i; // oops!
3)記憶體分配成功,但未初始化
int main()
char* s = (char*)malloc(10);
printf(s); // oops!
free(s);
return 0;
4)陣列越界
void f(int
a[10])
int i = 0;
for(i=0; i<10; i++)
a[i] = i; // oops!
printf("%d\n", a[i]);
int main()
inta[5];
f(a);
return 0;
5)記憶體洩漏(最好
單入口單出口)
void f(unsigned
int size)
int* p = (int*)malloc(size*sizeof(int));
int i = 0;
if( size % 2 != 0 )
return; // oops!
未free(p)
for(i=0; ip[i] = i;
printf("%d\n", p[i]);
free(p);
int main()
6)多次指標釋放(
誰申請誰釋放)
void f(int* p, int size)
int i = 0;
for(i=0; ip[i] = i;
printf("%d\n", p[i]);
free(p);
int main()
int* p = (int*)malloc(5 * sizeof(int));
f(p, 5);
free(p); // oops!
return 0;
7)使用已釋放的指標
void f(int* p, int size)
int i = 0;
for(i=0; iprintf("%d\n", p[i]);
free(p);
int main()
int* p = (int*)malloc(5 * sizeof(int));
int i = 0;
f(p, 5);
for(i=0; i<5; i++)
p[i] = i; // oops!
return 0;
5.規範
1)malloc申請後使用null,防止使用null指標
int* p = (int*)malloc(5 * sizeof(int));
if( p!=null)
{ //do something
free(p);
2)牢記陣列長度,防止越界(考慮使用柔性陣列)
3)動態
申請和釋放相匹配(誰申請誰釋放)
4)free指標之後必須立即賦值為
null
c語言記憶體管理 野指標 malloc
c 語言一共定義四個區塊 區 全域性變數和靜態變數區 棧 堆 針對四個區塊,使用者的記憶體分配也有三種不同的方式 靜態變數區 在 編譯的時候就分配好了,比如全域性變數,被static定義的變數 堆 這需要程式設計師自己分配和釋放,分別使用malloc和free函式 棧 在程式執行的時候,系統會自動的...
c語言野指標
1.什麼是野指標 野指標是隨機指向一塊記憶體的指標,容易造成記憶體洩露。但不一定每次都會產生段錯誤,因為可能分配到已經分配或申請過的位址。2.如何避免野指標 避免野指標需要養成一下良好的編碼習慣 1 當指標沒有指向時,給它置為空 0位址 null 因為在作業系統中,不能對0位址進行任何操作 置為空 ...
C語言野指標 記憶體洩漏 記憶體溢位的概念
野指標 釋放指標所指向的記憶體空間,和指標無關 在堆區分配100 sizeof char 個位元組的記憶體 char p char malloc 100 sizeof char 在用完後釋放記憶體 free p 這時候指標p所指向的存空間被釋放。但是這個時候p指標的值沒有發生變化,然後所指的記憶體空...