本博客文章合集html
指針是C語言一個很強大的功能。然而所謂成也蕭何,敗也蕭何,用好了指針會使程序大放異彩,用錯了指針輕者只是報個錯,重者可能整個系統都崩潰了。本篇咱們來談談指針一種錯誤的使用方法」野指針「。
野指針通常是指定義時沒有給初值的指針變量。來看如下程序:函數
#include <stdio.h> #include <string.h> int main() { char *source1 = "abc"; char *source2; printf("source2的值是:%u\n", source2); strcpy(source2 , source1); printf("%s",source2); return 0; }
這段程序定義了一個指向字符的指針source2,可是沒有給它一個初始值。下面的代碼就是將字符串」abc「複製到source2中,編譯的結果以下:
--------------------Configuration: Test - Win32 Debug--------------------
Compiling...
demo.c
D:\CCode\Test\demo.c(8) : warning C4700: local variable 'source2' used without having been initialized
Linking...
Test.exe - 0 error(s), 1 warning(s)
編譯給出一個告警,說source2沒有初值就被使用了。你能夠無視這個告警,而且運行程序,可是運行的結果多是災難性的。
因爲source2在定義時沒有給初值,程序運行時系統會默認給source2一個值,咱們能夠將程序中的
strcopy(source2 , source1);
printf("%s",source2);
這兩行代碼註釋掉,而後運行程序,看看source2輸出的值是多少。運行結果以下:
source2的值是:3435973836
Press any key to continue
可見source2被系統賦予一個值3435973836,而3435973836是一個內存的地址,至因而哪段內存地址,誰也不知道,多是操做系統自己所在的內存地址,也多是一個空的內存地址。若是是操做系統自己所在的內存地址,經過strcopy函數將」abc「複製給了這段內存地址,也就是修改了操做系統自己內存數據,你的計算機可能就崩掉了!因此指針在定義時必定要給一個初值,好比」NULL「。在本程序中,除了給source2賦初值外,還需使用malloc函數分配一塊存儲空間,使得source2指向這塊存儲空間。修改的程序以下:spa
#include <stdio.h> #include <string.h> #include<malloc.h> int main() { char *source1 = "abc"; char *source2 = NULL; printf("source2的初始值是:%u\n", source2); source2 = (char *)malloc(100); printf("source2的分配值是:%u\n", source2); strcpy(source2 , source1); printf("%s",source2); free(source2); source2 = NULL; return 0; }
在定義source2時賦初值NULL,在使用source2時分配一段內存空間,不用source2時釋放內存空間,而且從新賦值NULL。操作系統