一、疑问

有这样一道题:

#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语言字符串内存分配小记相关推荐

  1. C语言的内存分配模型

    C语言的内存分配模型 2008-03-12 19:32 C语言中的内存地址分配模型如下: 说明: 1.程序代码区:存放函数体的二进制代码. 2.全局区数据区:全局数据区划分为三个区域.全局变量和静态变 ...

  2. java 线程 内存分配内存_漫谈JAVA语言的内存分配

    在说JAVA语言的内存分配之前,我们先聊聊OS的Memory Management,这是学习操作系统课程的一个重要内容.从这里开始理解内存分配有利于理解的更深入. 我们知道物理内存是由page 和se ...

  3. 【嵌入式C语言】内存分配 malloc 和 free

    文章目录 永不分离的 malloc 和 free 1. 简介 2. void * 3. malloc 4. free 5. malloc.free 小结 5.1.连续内存块 5.2.双宿双飞才好 5. ...

  4. C语言动态内存分配详解

    文章目录 前言 一.为什么存在动态内存分配 1.已掌握的内存开辟方式 2.上述开辟空间方式的特点 3.为什么存在动态内存分配 二.动态内存函数的介绍 1.malloc 2.free 3.calloc ...

  5. 浅谈C语言动态内存分配及柔性数组

    文章目录 前言 1.动态内存的简单介绍 1.动态内存分配是什么? 2.为什么存在动态内存分配? 3.动态内存分配具体方法 1.动态内存函数 2.动态内存注意事项 2.经典面试题分析 3.C/C++程序 ...

  6. 通关GO语言14 内存分配:new 还是 make?什么情况下该用谁?

    程序的运行都需要内存,比如像变量的创建.函数的调用.数据的计算等.所以在需要内存的时候就要申请内存,进行内存分配.在 C/C++ 这类语言中,内存是由开发者自己管理的,需要主动申请和释放,而在 Go ...

  7. c语言释放内存函数,【C语言】内存分配函数malloc/ calloc/ realloc及内存释放free

    前言: 内存区域划分与分配: 1.栈区(stack)--程序运行时由编译器自动分配,存放函数的参数值,局部变量的值等,程序结束时由编译器自动释放. 2.堆区(heap) -- 在内存开辟另一块存储区域 ...

  8. c语言字符串数组分配没错,【字符串数组面试题】面试问题:C语言基础小结… - 看准网...

    26. 位段:指定结构体中成员变量所占的位数(以位的形式紧凑存储) unsigned char/int aaa:1 这里只能是unsigned char/int类型 27. 指针数组:int *p[1 ...

  9. c语言动态内存分配数组,【C】动态内存分配

    ## 动态内存分配的意义 C语言中的一切操作都是基于内存的 变量和数组都是内存的别名 内存分配由编译器在编译期间决定 定义数组的时候必须指定数组长度 数组长度是在编译期就必须确定的需求: 程序在运行过 ...

最新文章

  1. 安全、稳定、可靠甲骨文定义PaaS新时代
  2. C#游戏开发快速入门教程Unity5.5教程
  3. 大屏安卓车载导航刷机包_安卓手机第三方recovery是什么意思?
  4. python中long类型的取值范围_java基本数据类型取值范围
  5. 搜索技巧——持续更新
  6. filter-mutate过滤插件
  7. 类似于html的语言,其他语言的类似CL-WHO的HTML模板?
  8. 人口会一直增长下去吗_一直善良下去,你就会幸福
  9. 吴恩达团队新研究:用X光片识别14种疾病,AI准确度部分超越人类
  10. ***mysql 用一个表的一列,去更新另一表的一列
  11. 因子分析模型 - 案例按步骤详解 - (SPSS建模)
  12. html静态网站基于数码类电商购物网站网页设计与实现共计30个页面.rar(项目源码+毕业设计+论文+答辩PPT)
  13. OWASP Top 10 2017 10项最严重的 Web 应用程序安全风险
  14. PHP家庭账单系统,php在线家庭财务管理系统
  15. css鼠标hover的时候变成小手型
  16. 关于file_get_contents(php://input)
  17. phython编写图形界面
  18. Torvalds谈Linux行为准则
  19. [re]符号执行一把梭:2020网鼎杯青龙组re_signal_wp
  20. python中json.loads报错: Expecting ‘,‘ delimiter: line 1 column 3545 (char 3544)

热门文章

  1. 本机不安装oracle连接远程oracle
  2. 个人网红靠直播卖东西赚钱越来越困难 因为电商平台都杀进来了
  3. C语言使用系统声音制作很lou的音乐键盘
  4. 把google地图 和 Bing地图 无缝集合到 ArcMap中 —— ArcBruTile
  5. [区块链]详解以太坊标准发行通证Token代码(技术面看待ICO)
  6. 大数据系列的默认端口_各大数据库默认端口 - 感觉太煽情的个人空间 - OSCHINA - 中文开源技术交流社区...
  7. windows 系统下ssh不是内部或外部命令
  8. macOS快速复制文件夹路径
  9. 2022 auto.js实现淘宝双十一活动自动完成 解放双手(简单版)
  10. 2018年java进阶需要关注的公众号