c语言字符串内存分配小记
2024-10-21 04:17:49
一、疑问
有这样一道题:
#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 ; }
运行效果:
最新文章
- vtkQuadratic创建半球面
- 从零开始打造个人专属命令行工具集——yargs完全指南
- JqueryUI学习笔记-自动完成autocomplete
- IOS开发-CALayer和UIView详细汇总
- Adobe Dreamweaver(DW)
- BZOJ2818 欧拉函数
- 2016最全的web前端面试题及答案整理
- MySQL 5.6 for Windows 解压缩版配置安装(转)
- 初涉JavaScript模式 (12) : 沙箱模式
- Oracle学习笔记_09_字符串相关函数
- flutter获取状态栏高度
- 使用Node.js搭建数据爬虫crawler
- Centos 安装 android sdk(转)
- 在Linux系统上利用Tomcat搭建测试环境
- java 图片转换成base64字符串
- Linux基线合规检查中各文件的作用及配置脚本
- ReportViewer 安装
- activiti设置流程变量
- NUMA体系结构详解
- 沉淀再出发:再谈java的多线程机制