寫入位置時發生訪問衝突

寫入位置時發生訪問衝突
原因總結

1:使用了未初始化的指針(未給指針分配空間)

2:使用了已經刪除的指針

3.char str[]="ABCD",這個數組的存儲空間是在棧中開闢的(在棧中開闢了一個數組?)

char *str="ABCD",str指向的是靜態存儲區,"ABCD"是位於常量區的,指針str只是指向了這個位置(只在棧中開闢了一個指針內存?),那麼這些值就不能被修改。而上面數組中,要注意的是把字符複製到數組的元素中,那麼就是可以被任意修改的。

例:

  1. char* str = "ABCD"//char str[] = "ABCD";可以解決  
  2. strrev(str);  
  3. char * strrev(char str[]){  
  4. int j, i;  
  5. for(i = 0, j = strlen(str) - 1; i < j; i++, j--){  
  6. char tmp = str[i];  
  7. str[i] = str[j];//寫入位置時發生衝突  
  8. str[j] = tmp;  
  9. }  
  10. return str;  
  11. }  

分析:

程序代碼區:

  1.  1 //main.cpp  
  2.  2 int a=0;    //全局初始化區  
  3.  3 char *p1; //全局未初始化區  
  4.  4 main()  
  5.  5 {  
  6.  6     int b;                  //棧  
  7.  7     char s[]="abc";  //棧  
  8.  8     char *p2;           //棧  
  9.  9     char *p3="123456";   //123456\0在常量區,p3在棧上。  
  10. 10     static int c=0;     //全局(靜態)初始化區  
  11. 11     p1 = (char*)malloc(10);  
  12. 12     p2 = (char*)malloc(20);   //分配得來得10和20字節的區域就在堆區。  
  13. 13     strcpy(p1,"123456");   //123456\0放在常量區,編譯器可能會將它與p3所向"123456"優化成一個地方。  
  14. 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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章