c语言字符串内存分配小记
一、疑问
有这样一道题:
#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 ; }
运行效果:
c语言字符串内存分配小记的更多相关文章
- C语言中内存分配 (转)
在任何程序设计环境及语言中,内存管理都十分重要.在目前的计算机系统或嵌入式系统中,内存资源仍然是有限的.因此在程序设计中,有效地管理内存资源是程序员首先考虑的问题. 第1节主要介绍内存管理基本概念,重 ...
- 【转】C语言中内存分配
原文:C语言中内存分配 在任何程序设计环境及语言中,内存管理都十分重要.在目前的计算机系统或嵌入式系统中,内存资源仍然是有限的.因此在程序设计中,有效地管理内存资源是程序员首先考虑的问题. 第1节主要 ...
- C语言中内存分配
C语言中内存分配 在任何程序设计环境及语言中,内存管理都十分重要.在目前的计算机系统或嵌入式系统中,内存资源仍然是有限的.因此在程序设计中,有效地管理内存资源是程序员首先考虑的问题. 第1节主要 ...
- C语言中内存分配那些事儿
C程序的内存结构 C语言的之所以复杂,首先它的内存模型功不可没.不像某些那样的高级语言只需要在使用对象的时候,用new创建.所有之后的事情,你不需要操心.对于C语言,所有与内存相关的东西,都需要熟悉, ...
- C/C++语言学习——内存分配管理
1.一个由C编译的程序占用的内存分为以下几个部分 1.栈区(stack)— 程序运行时由编译器自动分配,存放函数的参数值,局部变量的值等.其操作方式类似于数据结构中的栈.程序结束时由编译器自动释放. ...
- C语言跟内存分配方式-alloc malloc calloc
转载:http://blog.csdn.net/ubuntulover/article/details/7581317 (1) 从静态存储区域分配.内存在程序编译的时候就已经分配好,这块内存在程序的整 ...
- java 字符串内存分配的分析与总结
经常在网上各大版块都能看到对于java字符串运行时内存分配的探讨,形如:String a = "123",String b = new String("123" ...
- C语言之内存分配函数
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { /********* ...
- C语言的内存分配
内存分为五大区: 1.栈区:在函数内部声明的变量都存在栈区,只管申请,系统会帮我们自动释放,释放的时间是作用域结束,遵循先进后出(first in last off(FILO)),栈的开辟是连续的,不 ...
随机推荐
- 如何查找BAPI SD_SALESDOCUMENT_CHANGE里的字段对应的数据库存储表
BAPI函数SD_SALESDOCUMENT_CHANGE可以让我们很方便地通过ABAP代码来修改Sales Order. 其输入参数ORDER_HEADER_IN的类型是BAPISDHD1, 里面包 ...
- Linux Mint,Ubuntu 18 ,Deepin15.7 安装mysql 没有提示输入密码,修改root用户密码过程
刚刚装Deepin15.7 和 MySQL5.7 发现没有提示用户输入密码的过程(近日发现Linux Mint 和 Ubuntu18 也适用) 百度了一大堆如何修改root密码 也没什么卵用,终于这篇 ...
- IOS 获取.plist文件的数据
@property (nonatomic,strong) NSArray *apps; //获取.plist数据 /**获取plist文件的数组数据*/ -(NSArray *)apps{ if( ...
- web的攻击技术
简单的http协议本身并不存在安全性问题,因此技术本身几乎不会成为攻击的对象,应用http协议的服务器和客户端,以及运行在服务器端web应用等资源才是攻击目标,那么怎么攻击,来源于哪里呢 web应用攻 ...
- paper-list
1.yolo-v1,yolo-v2,yolo-v3 2.ssd,focal loss,dssd 3.fast-rcnn,faster-rcnn,r-fcn,Light-Head R-CNN,R-FCN ...
- js另类值交换
当我们有a.b两个值,想要交换,通常是要声明第三个变量,但是我最近看到这样一种不用声明第三个变量的处理方法: var a=1,b=2; a=[b,b=a][0]; 其实还是在内存中开出了一个新的空间( ...
- 第35章 WWDG—窗口看门狗—零死角玩转STM32-F429系列
第35章 WWDG—窗口看门狗 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fir ...
- C#流程控制语句
C#流程控制语句 一.选择语句 当程序中需要进行两个或两个以上的选择时,可以根据条件的判断来选择将要执行的一组语句. ?if语句 ?switch语句 二.循环语句 循环语句是对一个程序模块进行的重复操 ...
- Python学习之路——基础1
python作为一门解释型的编程语言,和c/c++等其他语言都或多或少有相通的地方,所以有语言基础的话,学起来还是方便一些.所以我的笔记对于相对简单的概念可能会选择放过,但对自己记录的东西我会力求完备 ...
- javascript入门笔记2-window
1.JavaScript-输出内容(document.write) <script type="text/javascript"> document.write(&qu ...