C語言記憶體(野指標 )

2021-08-04 02:54:01 字數 2800 閱讀 7925

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指標的值沒有發生變化,然後所指的記憶體空...