c语言字符串内存分配小记
一、疑问
有这样一道题:
#include "stdio.h"int main()
{char word1[8];char word2[8];scanf("%s", word1);scanf("%s", word2);printf("word1=%s##word2=%s\n", word1, word2);return 0;
}
运行代码,输入:
12345678
12345678
后,为什么输出的是:
word1=##word2=12345678
word1哪去了。
二、分析
由于c语言局部简单变量是存在栈中,栈是先进后出的,所以先定义的变量在栈底。那么输入了word1后,内存中变量是下面这样的:
我们可以看到,B8已经超出了word1定义的字符数组的范围。
当word2输入后,内存中变量变成了这样的:
由于只给了A8到AF共8个地址空间(由于最后一位要放字符串结束标志\0,所以实际只能用A8到AE),但输入了8个字符,所以导致字符串结束标志写入到了下一块内存地址(也就是B0中)。
三、验证
#include "stdio.h"int main()
{char word1[8];char word2[8];scanf("%s", word1);scanf("%s", word2);int count = 8;int i;printf("\nword1 begin addr = %p\n", word1);for(i=0;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=0;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 0; }
运行效果:
转载于:https://my.oschina.net/artwl/blog/694340
c语言字符串内存分配小记相关推荐
- C语言的内存分配模型
C语言的内存分配模型 2008-03-12 19:32 C语言中的内存地址分配模型如下: 说明: 1.程序代码区:存放函数体的二进制代码. 2.全局区数据区:全局数据区划分为三个区域.全局变量和静态变 ...
- java 线程 内存分配内存_漫谈JAVA语言的内存分配
在说JAVA语言的内存分配之前,我们先聊聊OS的Memory Management,这是学习操作系统课程的一个重要内容.从这里开始理解内存分配有利于理解的更深入. 我们知道物理内存是由page 和se ...
- 【嵌入式C语言】内存分配 malloc 和 free
文章目录 永不分离的 malloc 和 free 1. 简介 2. void * 3. malloc 4. free 5. malloc.free 小结 5.1.连续内存块 5.2.双宿双飞才好 5. ...
- C语言动态内存分配详解
文章目录 前言 一.为什么存在动态内存分配 1.已掌握的内存开辟方式 2.上述开辟空间方式的特点 3.为什么存在动态内存分配 二.动态内存函数的介绍 1.malloc 2.free 3.calloc ...
- 浅谈C语言动态内存分配及柔性数组
文章目录 前言 1.动态内存的简单介绍 1.动态内存分配是什么? 2.为什么存在动态内存分配? 3.动态内存分配具体方法 1.动态内存函数 2.动态内存注意事项 2.经典面试题分析 3.C/C++程序 ...
- 通关GO语言14 内存分配:new 还是 make?什么情况下该用谁?
程序的运行都需要内存,比如像变量的创建.函数的调用.数据的计算等.所以在需要内存的时候就要申请内存,进行内存分配.在 C/C++ 这类语言中,内存是由开发者自己管理的,需要主动申请和释放,而在 Go ...
- c语言释放内存函数,【C语言】内存分配函数malloc/ calloc/ realloc及内存释放free
前言: 内存区域划分与分配: 1.栈区(stack)--程序运行时由编译器自动分配,存放函数的参数值,局部变量的值等,程序结束时由编译器自动释放. 2.堆区(heap) -- 在内存开辟另一块存储区域 ...
- c语言字符串数组分配没错,【字符串数组面试题】面试问题:C语言基础小结… - 看准网...
26. 位段:指定结构体中成员变量所占的位数(以位的形式紧凑存储) unsigned char/int aaa:1 这里只能是unsigned char/int类型 27. 指针数组:int *p[1 ...
- c语言动态内存分配数组,【C】动态内存分配
## 动态内存分配的意义 C语言中的一切操作都是基于内存的 变量和数组都是内存的别名 内存分配由编译器在编译期间决定 定义数组的时候必须指定数组长度 数组长度是在编译期就必须确定的需求: 程序在运行过 ...
最新文章
- 安全、稳定、可靠甲骨文定义PaaS新时代
- C#游戏开发快速入门教程Unity5.5教程
- 大屏安卓车载导航刷机包_安卓手机第三方recovery是什么意思?
- python中long类型的取值范围_java基本数据类型取值范围
- 搜索技巧——持续更新
- filter-mutate过滤插件
- 类似于html的语言,其他语言的类似CL-WHO的HTML模板?
- 人口会一直增长下去吗_一直善良下去,你就会幸福
- 吴恩达团队新研究:用X光片识别14种疾病,AI准确度部分超越人类
- ***mysql 用一个表的一列,去更新另一表的一列
- 因子分析模型 - 案例按步骤详解 - (SPSS建模)
- html静态网站基于数码类电商购物网站网页设计与实现共计30个页面.rar(项目源码+毕业设计+论文+答辩PPT)
- OWASP Top 10 2017 10项最严重的 Web 应用程序安全风险
- PHP家庭账单系统,php在线家庭财务管理系统
- css鼠标hover的时候变成小手型
- 关于file_get_contents(php://input)
- phython编写图形界面
- Torvalds谈Linux行为准则
- [re]符号执行一把梭:2020网鼎杯青龙组re_signal_wp
- python中json.loads报错: Expecting ‘,‘ delimiter: line 1 column 3545 (char 3544)
热门文章
- 本机不安装oracle连接远程oracle
- 个人网红靠直播卖东西赚钱越来越困难 因为电商平台都杀进来了
- C语言使用系统声音制作很lou的音乐键盘
- 把google地图 和 Bing地图 无缝集合到 ArcMap中 —— ArcBruTile
- [区块链]详解以太坊标准发行通证Token代码(技术面看待ICO)
- 大数据系列的默认端口_各大数据库默认端口 - 感觉太煽情的个人空间 - OSCHINA - 中文开源技术交流社区...
- windows 系统下ssh不是内部或外部命令
- macOS快速复制文件夹路径
- 2022 auto.js实现淘宝双十一活动自动完成 解放双手(简单版)
- 2018年java进阶需要关注的公众号