一个经典的问题的思考: strcpy覆盖内存
2017-06-26 00:06
274 查看
转自:http://m.blog.csdn.net/shanchangyi/article/details/52058501
查看各个字节的地址 d的四个字节的地址分别为 fee2,fee3,fee4,fee5
s的十个字节的地址分别为 fee6,fee7,fee8,fee9·······feef;
压栈中向下生长,由高地址压入低地址,先压栈s中 ‘/0’ ,然后’9’8 7·············然后压入d的/0 3 2 1;
在strcpy前插入断点,运行前
运行过以后结果如下图所示:
可知 d为123456789
s为56789
d和s内存连续 ,复制时将他们的某些值覆盖,才导致了上述问题,那么应该怎样解决呢?
1.
2.
#include<stdio.h> #include<stdlib.h> int main(void) { char s[]="123456789"; char d[]="123"; strcpy(d,s); printf("%s,\n%s",d,s); return 0; }
查看各个字节的地址 d的四个字节的地址分别为 fee2,fee3,fee4,fee5
s的十个字节的地址分别为 fee6,fee7,fee8,fee9·······feef;
压栈中向下生长,由高地址压入低地址,先压栈s中 ‘/0’ ,然后’9’8 7·············然后压入d的/0 3 2 1;
在strcpy前插入断点,运行前
运行过以后结果如下图所示:
可知 d为123456789
s为56789
d和s内存连续 ,复制时将他们的某些值覆盖,才导致了上述问题,那么应该怎样解决呢?
1.
#include<stdio.h> #include<stdlib.h> int main() { char s[10]="123456789"; char d[10 4000 ]="123"; strcpy(d,s); printf("%s,\n%s",d,s); return 0; }
2.
#include<stdio.h> #include<stdlib.h> int main() { char *s=(char*)malloc(10); char *d=(char*)malloc(10) strcpy(d,"123456789"); strcpy(s,"123456789"); printf("%s,\n%s",d,s); return 0; }
相关文章推荐
- 一个经典的问题的思考: strcpy覆盖内存
- strcpy()和memcpy()函数中忽略的内存覆盖问题
- 一个问题引发对Linux swap和内存的思考
- 关于Java继承一个值得思考的问题。
- android service是否在同一个内存的问题
- 利用运行时,给UIImageView写一个分类,交换里面的setImage的方法,可以重绘图片,提高内存的利用率(要是没有重绘图片,直接使用系统提供的setImag就会造成占用大量的内存问题)
- 转:javascript作用域一个经典问题
- 记一个linux内核内存提权问题
- 秒杀多线程第四篇 一个经典的多线程同步问题
- CSS的一个FAQ问题——浮动层覆盖问题!!!
- 一个Java内存可见性问题的分析
- 多线程3:一个经典的多线程同步问题
- 覆盖Django mysql model中save方法时碰到的一个数据库更新延迟问题
- 解决问题--VS2012中一个Panel覆盖另一个Panel时拖动时容易造成两个控件成父子关系的避免
- 秒杀多线程第四篇 一个经典的多线程同步问题
- 秒杀多线程-一个经典的多线程同步问题
- 每一位游戏设计师都必须思考的一个问题
- 秒杀多线程第四篇 一个经典的多线程同步问题
- c 中的一个经典错误:画内存图
- 关于启动vagrant up 蓝屏的一个问题的思考