您的位置:首页 > 其它

最近在探讨关于缓冲区溢出的相关问题,各位大侠帮忙看看这个程序,两个for循环导致内存内容不一样,其中的玄妙在哪里?我是嫩草,谢啦谢啦~~

2011-04-01 18:18 846 查看
 

 

/*缓冲区溢出实验操作*/

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
  int i='a';  /* char  i='a';*/
  char prepare[6];
  char *nowString="abcdefghijklmnopXqrstuvwxyz";
  strcpy(prepare,nowString);

  printf("size(int):%d/n",sizeof(int));// 本机器上 int 4字节
  printf("size(char):%d/n/n",sizeof(char));//本机器上 char 1 字节

  printf("%s-----nowString/n",nowString);
  printf("%s-----prepare/n",prepare);
   
  /*******************************************/
   /*两个for循环,执行后为什么使内存中的数据不一样了呢?1 和 2 的结果不相同,原因在哪里?for中对i初始化时,编译器做了什么?*/
*/

  for(;i<'k';i++)printf(" ");          /* 1 */         /*字符串空间跟 i 的存储空间重合了,修改i的值是字符串的数据也发生变化*/
 // for(i='a';i<'k';i++)printf(" ");  /*  2 */       
  /* 1 中的i++似乎没有往i的存储空间写数据?*/

  /************/
  /*******************************************/

  printf("%s/n",prepare+10);

  printf("%ld/n",(int *)&i); /*(char *)&a */    //缓冲区溢出,变量i的存储空间跟字符串空间复合掉了
  printf("%ld",prepare+16);//i 的地址跟 字符串某一字符地址相同

  printf("/n");

  printf("prepare[15]:%c/n",*(prepare+15));

  printf("prepare[16]:%c/n",*(prepare+16));

  printf("prepare[17]:%c/n",*(prepare+17));

  printf("prepare[17]:%c/n",*(prepare+18));

  printf("prepare[17]:%c/n",*(prepare+19));

  printf("prepare[17]:%c/n",*(prepare+20));

  printf("prepare[17]:%c/n",*(prepare+21));

  printf("prepare[17]:%c/n",*(prepare+22));

  while(1);
}

 

 



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  存储 编译器
相关文章推荐