一、疑问

有这样一道题:

#include "stdio.h"

int main()
{
char word1[];
char word2[]; scanf("%s", word1);
scanf("%s", word2); printf("word1=%s##word2=%s\n", word1, word2); return ;
}

运行代码,输入:


后,为什么输出的是:

word1=##word2=

word1哪去了。

二、分析

由于c语言局部简单变量是存在栈中,栈是先进后出的,所以先定义的变量在栈底。那么输入了word1后,内存中变量是下面这样的:

我们可以看到,B8已经超出了word1定义的字符数组的范围。

当word2输入后,内存中变量变成了这样的:

由于只给了A8到AF共8个地址空间(由于最后一位要放字符串结束标志\0,所以实际只能用A8到AE),但输入了8个字符,所以导致字符串结束标志写入到了下一块内存地址(也就是B0中)。

三、验证

#include "stdio.h"

int main()
{
char word1[];
char word2[]; scanf("%s", word1);
scanf("%s", word2); int count = ;
int i;
printf("\nword1 begin addr = %p\n", word1);
for(i=;i<count;i++)
{
printf("word1[%d]=%c addr=%p\n", i, word1[i], &word1[i]);
} printf("\n-------------------------------\n"); printf("word2 begin addr = %p\n", word2);
for(i=;i<count;i++)
{
printf("word2[%d]=%c addr=%p\n", i, word2[i], &word2[i]);
} printf("\n-------------------------------\n"); printf("word1=%s##word2=%s\n", word1, word2); printf("0x0028FEB8=%c\n", *(int*)0x0028FEB8); return ; }

运行效果:

最新文章

  1. vtkQuadratic创建半球面
  2. 从零开始打造个人专属命令行工具集——yargs完全指南
  3. JqueryUI学习笔记-自动完成autocomplete
  4. IOS开发-CALayer和UIView详细汇总
  5. Adobe Dreamweaver(DW)
  6. BZOJ2818 欧拉函数
  7. 2016最全的web前端面试题及答案整理
  8. MySQL 5.6 for Windows 解压缩版配置安装(转)
  9. 初涉JavaScript模式 (12) : 沙箱模式
  10. Oracle学习笔记_09_字符串相关函数
  11. flutter获取状态栏高度
  12. 使用Node.js搭建数据爬虫crawler
  13. Centos 安装 android sdk(转)
  14. 在Linux系统上利用Tomcat搭建测试环境
  15. java 图片转换成base64字符串
  16. Linux基线合规检查中各文件的作用及配置脚本
  17. ReportViewer 安装
  18. activiti设置流程变量
  19. NUMA体系结构详解
  20. 沉淀再出发:再谈java的多线程机制

热门文章

  1. s7nodave用于上位机连接西门子PLC,开源项目epics
  2. 在Markdown中插入不会显示的注释文本
  3. SAP Fiori里的List是如何做到懒加载Lazy load的
  4. Java解析Excel工具类(兼容xls和xlsx)
  5. Vuex进阶
  6. 简单使用mybatis(idea中使用)
  7. js 实现链表
  8. iOS接入微信登录可能遇到的问题
  9. 爬虫学习(十一)——bs4基础学习
  10. Dapper and Repository Pattern in MVC