今天終於看完了C語言深度剖析這本書,對C語言有了進一步的了解與感悟,突然發覺原來自己學C語言的時候學得是那樣的迷糊,缺少深入的思考,在重新看書的時候發覺C語言基本教材雖然經典,但是缺乏獨到性,老師在講解的過程中也就照本宣科了,沒有多大的啟迪。
看到C語言內存管理這塊,發覺還是挺有用的,當然平時在編程時基本上就沒有考慮過內存問題。
定義了指針變量,沒有為指針分配內存,即指針沒有在內存中指向一塊合法的內存,尤其是結構體成員指針未初始化,往往導致運行時提示內存錯誤。
#include "stdio.h" #include "string.h" struct student { char *name; int score; struct student *next; }stu, *stul; int main() { strcpy(stu.name,"Jimy"); stu.score = 99; return 0; }
由於結構體成員指針未初始化,因此在運行時提示內存錯誤
#include “stdio.h” #include "malloc.h" #include "string.h" struct student { char *name; int score; struct student* next; }stu,*stu1; int main() { stu.name = (char*)malloc(sizeof(char)); /*1.結構體成員指針需要初始化*/ strcpy(stu.name,"Jimy"); stu.score = 99; stu1 = (struct student*)malloc(sizeof(struct student));/*2.結構體指針需要初始化*/ stu1->name = (char*)malloc(sizeof(char));/*3.結構體指針的成員指針同樣需要初始化*/ stu.next = stu1; strcpy(stu1->name,"Lucy"); stu1->score = 98; stu1->next = NULL; printf("name %s, score %d \n ",stu.name, stu.score); printf("name %s, score %d \n ",stu1->name, stu1->score); free(stu1); return 0; }
同時也可能出現沒有給結構體指針分配足夠的空間
stu1 = (struct student*)malloc(sizeof(struct student));/*2.結構體指針需要初始化*/
如本條語句中往往會有人寫成
stu1 = (struct student*)malloc(sizeof(struct student *));/*2.結構體指針需要初始化*/
這樣將會導致stu1的內存不足,因為sizeof(struct student)的長度為8,而sizeof(struct student *)的長度為4,在32位系統中,編譯器默認會給指針分配4字節的內存
