简单的vc+问题,char的内存大小

问题描述

简单的vc+问题,char的内存大小

在下看书的时候是说
char abc [15];
那么abc就只能放14个字节的内容
但是我输入sdkfoeldkejllsk,程序没有报错是为什么呢
上一行是输入了十五个字母
后来我又试了试16个字母,就不举例子了,但还是通过了验证
一直到17个菜出现溢出。

解决方案

首先你申请了15个字节大小的内存,然后一般情况下,你只能用14个大小,最后一个你要赋值为'',以标示这个字符串的结束。如果你放了15个字符串,而没有在字符串的末端添加结束符,你在使用strcpy等函数时,程序会一直寻找结束符,而不是你定义了多大,他就访问多大。所以你输了16个字符
,那么在系统看来,你的字符串在第十六个字符还没有结束,他认为你的字符串在第十六个字符之后首次出现结束符的地方结束。那么问题来了,你这样是会访问你不该访问的内存单元的,所以你写是没问题的,问题是当你越界写数据的时候,如果这个内存单元是系统再用,你那就非法访问了,程序就挂了。

解决方案二:

刚刚在网上找到说的过去的答案,也感觉挺在理的。给你借鉴下吧~

字符数组其实就是字符指针 你这样使用实际上是访问了没有保护的内存地址 也就是说读取(甚至写入)了未分配的内存 相当于偷偷占用了不属于你的内存空间 如果没遇到冲突貌似相安无事 如果遇到冲突则程序会出错(其实直接读取未分配的内存已经是出错了)这是非常严重的bug 必须避免

解决方案三:

abc只是单纯的指针,处理成字符串的时候,寻找'',如果没有,就一直向后找。
当你赋值的时候,可以赋值成无限长,但是它之后的内存有可能分配给其他元素了,所以就出错了。
这就是指针的灵活性,也算缺点吧

解决方案四:

你定义了char数组abc,长度是15,可以存放15个字符,没问题。
但是如果存放了15个字符,这里面没有字符串结束标志的话,那你就不能把这个数组当字符串来使用了。
所以有的书说最多存放14个字符,最后一个放字符串结束标志0,即abc[14]=0;

如果你不想当字符串使用,只是作为存放字符的数组使用,存放15个字符没问题。

时间: 2024-12-24 20:48:57

简单的vc+问题,char的内存大小的相关文章

Java Cache-EHCache系列之计算实例占用的内存大小(SizeOf引擎)

在EHCache中,可以设置maxBytesLocalHeap.maxBytesLocalOffHeap.maxBytesLocalDisk值,以控制Cache占用的内存.磁盘的大小(注:这里Off Heap是指Element中的值已被序列化,但是还没写入磁盘的状态,貌似只有企业版的EHCache支持这种配置:而这里maxBytesLocalDisk是指在最大在磁盘中的数据大小,而不是磁盘文件大小,因为磁盘文中有一些数据是空闲区),因而EHCache需要有一种机制计算一个类在内存.磁盘中占用的字

Android获取设备CPU核数、时钟频率以及内存大小的方法_Android

本文实例讲述了Android获取设备CPU核数.时钟频率以及内存大小的方法.分享给大家供大家参考,具体如下: 因项目需要,分析了一下 Facebook 的开源项目 - Device Year Class. Device Year Class 的主要功能是根据 CPU核数.时钟频率 以及 内存大小 对设备进行分级.代码很简单,只包含两个类: DeviceInfo -> 获取设备参数, YearClass -> 根据参数进行分级. 下表是 Facebook 公司提供的分级标准,其中 Year 栏表

字符串-C语言关于char分配内存的问题

问题描述 C语言关于char分配内存的问题 环境 :Linux Ubuntu 14.04 #include<stdio.h> #include<string.h> #include<malloc.h> int main() { char *str1; char *str2="hello"; char *str3="world"; str1=malloc(3*sizeof(char)); strcpy(str1,str3);// c

c++-用C++怎样获取处理器信息、硬盘大小、内存大小等信息

问题描述 用C++怎样获取处理器信息.硬盘大小.内存大小等信息 处理器信息是这样的:Intel(R) Core(TM) i3 cpu M 380 @2.53GHz 有没有api直接获取的(求大神解答,谢谢) 解决方案 最简单的是直接去注册表中读,在HKEY_LOCAL_MACHINEHARDWAREDESCRIPTIONSystemCentralProcessorProcessorNameString 也可以用wim接口或者用嵌入式汇编调用cpuid直接获取.还可以调用systeminfo,从它

成员函数-关于实例化一个类时占用的内存大小问题

问题描述 关于实例化一个类时占用的内存大小问题 在PHP语言中,写一个类,如果类的成员函数 很多,会不会增大实例化这个类时占用的内存?如下:class abc{public function __construct(){xxxxxx;xxxxxx;}public function a(){xxxxxx;}public function b(){xxxxxxx;}}//classs那当我实例化它时,是不是函数 越多占的内存越大? 解决方案 函数当然占用一些空间,但是要分清楚函数和调用函数两个概念.

如何设置Tomcat的JVM虚拟机内存大小

Tomcat本身不能直接在计算机上运行,需要依赖于硬件基础之上的操作系统和一个java虚拟机.您可以选择自己的需要选择不同的操作系统和对应的JDK的版本(只要是符合Sun发布的Java规范的),但我们推荐您使用Sun公司发布的JDK.确保您所使用的版本是最新的,因为Sun公司和其它一些公司一直在为提高性能而对java虚拟机做一些升级改进.一些报告显示JDK1.4在性能上比JDK1.3提高了将近10%到20%. 可以给Java虚拟机设置使用的内存,但是如果你的选择不对的话,虚拟机不会补偿.可通过命

VC中char和TCHAR的数据类型转换

char:计算机编程语言(c.c++.java.VFP等)中可容纳单个字符的一种基本数据类型. TCHAR:为了满足Unicode编码,对char的扩展,即_T("str")表示TCHAR类型 C++支持 两种字符串,即常规的ANSI编码(使用""包裹)和Unicode编码(使用L""包裹) ,这样对应的就有了两套字符串字符串处理函数,比如:strlen和wcslen,分别用于处理两种字符串 char和TCHAR类型 winnt.h头文件中:  

Android中一张图片加载后所占用内存大小的获取与测试

Android程序中一旦加载的图片比较多,就有可能出现Out of Memory而导致程序崩溃.这个一方面是因为Android系统本身对于每个单独的进程有内存大小的限制(有16M,64M,128M,256M等等),另一方面是因为Android系统对于图片资源的垃圾回收比较慢(文章http://jiangnane.com/index.php/archives/230中对Android源码进行了分析,发现Android的setImageViewBitmap(Bitmap bm)方法的源码中没有建立新

查看win7系统下Aero特效占用系统内存大小的方法

  在win7系统下的Aero特效能够让用户在操作系统时候带来不一样的立体感,Aero是由Authentic.Energetic.Reflective及Open四个单词的缩写,其意为具立体感.令人震撼.具透视感和阔大的用户界面,不过有些用户反映在win7系统下开启了Aero特效出现系统卡顿的问题,对于这类用户是否真正因为开启Aero特效造成的呢?下面小编为大家提供了Aero特效所占用内存大小的查看方法,下面我们一起看下吧! 查看win7系统下Aero特效占用系统内存大小的方法 1.右键点击任务栏