關於C語言,字符數組中越界的兩個問題

#include<stdio.h>
#include<string.h>
void main()
{
  char ch1[8];        

  char ch2[3] = "df";                                
  char ch3[2][2];        
  int i = 0;
 
                                                                                                         
  printf("first printf:%s", ch2);       // (1)                                                 
  strcpy(*(ch3+1) , ch2);
  while(ch3[1][i] != '/0')                                                               
   i++;
  printf("%d",i);                            //(5)                                                                      
 
 printf("/nsecond printf:%s", *(ch3+1));    //(2);
 printf("/nthird printf:%s", ch2);               //(3)
 strcpy(ch1, ch2);
 printf("/nfourth printf:/n%s",  ch1);    //(4);
 return;
}
只有(1)行打出了df ,(2)(3)(4)行均未打出字符,第(5)行打出數字2;

1.通過運行這個程序,發現ch2已是空字符數組;爲什麼ch2的字符數組內容變了?

2.ch3二維數組的第二行,經過賦予兩個字符後,應該已經越界,爲什麼,在緊接着的ch2[2] = '/0'?

 

 

#include<stdio.h>
#include<string.h>
void main()
{
  char ch1[8];        

  char ch2[3] = "df";                                
  char ch3[2][2];        
  int i = 0;
 
 
  printf("first printf:%s", ch2);    //     (1);
  strcpy(*(ch3+0) , ch2);
  while(ch3[0][i] != '/0')
   i++;
  printf("%d",i);                          //     (5);
 
 printf("/nsecond printf:%s", *(ch3+0));    //     (2);
 printf("/nthird printf:%s", ch2);                        //     (3)
 strcpy(ch1, ch2);
 printf("/nfourth printf:%s",  ch1);    //       (4);
 return;
}

這個程序,只將ch2賦予了ch3[0]而已的改動,但得出了正確的打出結果,即(1)(2)(3)(4)都打出df,(5)打出數字2;

在調試過程中發現ch[0][2] == '/0'與ch[1][0] == '/0',推測這兩個元素是否佔用同樣的內存?

 

 

通過調試上面這兩個程序,發現在給ch2,ch3分配內存時,ch2起始地址:ox0012ff74,ch3起始地址:ox0012ff70

在第一個程序中,ch3[1]越界至ox0012ff74,給此地址,賦予'/0';而strcpy與printf函數,在拷貝與打出字符串內容時,都是以'/0'爲結束,標誌,這就是爲什麼ch2字符數組內容變爲空字符串的原故.

而在第二個程序中,實際上ch3[0]也發生越界,不過是ch3中的"內部"越界,'/0'賦予到了ch3[1][0]中;

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