博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C语言strcpy函数所引发的问题
阅读量:4364 次
发布时间:2019-06-07

本文共 1068 字,大约阅读时间需要 3 分钟。

如下的C语言代码:

 

[cpp]   
 
 
  1. #include <stdio.h>   
  2. #include <stdlib.h>   
  3. #include <string.h>   
  4.   
  5. int main()  
  6. {  
  7.   char *a, *b;   
  8.   int i;   
  9.   
  10.   a = (char*) calloc(20, sizeof(char));   
  11.   b = (char*) calloc(20, sizeof(char));   
  12.   
  13.   strcpy(a, "Graduate School of Information Science and Technology");   
  14.   
  15.   for(i = 0; i < 20; i++)   
  16.      printf("b[%d] = %c\n", i, b[i]);   
  17.   return 0;   
  18. }  


已知:

 

b[11] = T

那么,b[12]、b[13]的值是多少?

在linux上创建一个文件t.c,输入代码,然后编译、运行:

 

[plain]   
 
 
  1. [ggg@localhost ~]$ cd Desktop  
  2. [ggg@localhost Desktop]$ ls  
  3. gnome-terminal.desktop  t.c  t.c~  
  4. [ggg@localhost Desktop]$ gcc -o t t.c  
  5. [ggg@localhost Desktop]$ ./t  
  6. b[0] = c  
  7. b[1] = i  
  8. b[2] = e  
  9. b[3] = n  
  10. b[4] = c  
  11. b[5] = e  
  12. b[6] =    
  13. b[7] = a  
  14. b[8] = n  
  15. b[9] = d  
  16. b[10] =    
  17. b[11] = T  
  18. b[12] = e  
  19. b[13] = c  
  20. b[14] = h  
  21. b[15] = n  
  22. b[16] = o  
  23. b[17] = l  
  24. b[18] = o  
  25. b[19] = g  
  26. [ggg@localhost Desktop]$   

论坛会员qldsrx的解释是:

其实是和内存分配是否连续有关,如果两次申请的内存是连续内存空间,那么20字节再加上后面申请内存的头部字节(预估是12字节),这样下面一个申请的20字节正好偏移了32字节
这个时候如果在return之前添加 free(b); 立刻程序崩溃,
因为b这个对象释放时要查找b申请的大小,信息记录在其内存的前面(预估是12个字节),但被改写了。

 

另外,用visual c++ 6.0尝试了一下,发现数组b中没有任何值,这说明在内存分配上确实和linux平台下的C编译器有很大的差别。

 

转载于:https://www.cnblogs.com/momogua/p/8304324.html

你可能感兴趣的文章
职业规划
查看>>
JavaScript设计模式 Item 3 --封装
查看>>
一段个性化stringgrid的代码
查看>>
wx.ScrolledWindow wx.PseudoDC
查看>>
莫比乌斯反演
查看>>
【BZOJ】【1041】【HAOI2008】圆周上的点
查看>>
高并发常见面试题
查看>>
java面向对象中的抽象,类与对象
查看>>
Git学习笔记
查看>>
《Java技术》第二次作业计科1501赵健宇
查看>>
判断线段和直线相交 POJ 3304
查看>>
下拉菜单
查看>>
.net中调用exchange服务器发邮件
查看>>
nginx知识问答
查看>>
JS - 跳转页面
查看>>
显示消息提示对话框(WebForm)
查看>>
分享下自己编译 XBMC 的过程(zhuan)
查看>>
selenium3 + python - cookie定位
查看>>
通过百度地图API获取地址经纬度
查看>>
Map接口
查看>>