关于C语言,字符数组中越界的两个问题

来源:互联网 发布:淘宝网申请 编辑:程序博客网 时间:2024/04/20 06:40

#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]中;