1:使用了未初始化的指針(未給指針分配空間)
2:使用了已經刪除的指針
3.char str[]="ABCD",這個數組的存儲空間是在棧中開闢的(在棧中開闢了一個數組?)
char *str="ABCD",str指向的是靜態存儲區,"ABCD"是位於常量區的,指針str只是指向了這個位置(只在棧中開闢了一個指針內存?),那麼這些值就不能被修改。而上面數組中,要注意的是把字符複製到數組的元素中,那麼就是可以被任意修改的。
例:
- char* str = "ABCD"; //char str[] = "ABCD";可以解決
- strrev(str);
- char * strrev(char str[]){
- int j, i;
- for(i = 0, j = strlen(str) - 1; i < j; i++, j--){
- char tmp = str[i];
- str[i] = str[j];//寫入位置時發生衝突
- str[j] = tmp;
- }
- return str;
- }
分析:
程序代碼區:
- 1 //main.cpp
- 2 int a=0; //全局初始化區
- 3 char *p1; //全局未初始化區
- 4 main()
- 5 {
- 6 int b; //棧
- 7 char s[]="abc"; //棧
- 8 char *p2; //棧
- 9 char *p3="123456"; //123456\0在常量區,p3在棧上。
- 10 static int c=0; //全局(靜態)初始化區
- 11 p1 = (char*)malloc(10);
- 12 p2 = (char*)malloc(20); //分配得來得10和20字節的區域就在堆區。
- 13 strcpy(p1,"123456"); //123456\0放在常量區,編譯器可能會將它與p3所向"123456"優化成一個地方。
- 14 }
存取效率的比較
char s1[]="aaaaaaaaaaaaaaa";
char *s2="bbbbbbbbbbbbbbbbb";
aaaaaaaaaaa是在運行時刻賦值的;而bbbbbbbbbbb是在編譯時就確定的;但是,在以後的存取中,在棧上的數組比指針所指向的字符串(例如堆)快。
原文鏈接:http://blog.csdn.net/pipisorry/article/details/37055183
ref:用遞歸實現字符串反轉http://blog.csdn.net/andysun1986/article/details/6941230