使用char型数组过程中遇到的问题

2023-11-06

简述

最近开发中用到了char数组来接收数据 , 在使用中遇到了一些问题,这里记录一下,同时也回顾一下char数组的用法。

代码之路

事例一

char aa[0];

首先,我们要知道,0长度的数组在ISO C和C++的规格说明书中是不允许的,用VS2013编译报错:“不能分配常量大小为 0 的数组”。

事例二:

char aa[4] = "1234";

这里写图片描述
这样我们定义一个长度为4的数组,直接赋值“1234”,这里会提示 数组界限溢出,看上图中提示,“1234”实际上类似char bb[5] = “1234”; 说明“1234”后面还有一个字符结束符’\0’的存在,所以占了5个字符。

那么char数组最后一位必须是’\0’吗?不一定,‘\0’只是字符串的结束标记,并没有规定char数组的最后一位必须是’\0’,那为什么这里将“1234”赋值给aa[4] 这个数组不行呢,’1’、’2’、’3’、’4’刚好4个字符分别分配给aa[0]、aa[1]、aa[2]、aa[3],这样的确可以,下面会给出例子确实可以这样分配,但是这里的 “1234”如上所述是类似于一个char bb[5] 的数组,你能把一个长度为5的数组强行赋值给一个长度为4的数组吗?,,,显然不可以,所以这里会提示错误。

事例三:

char aa[4];
char bb[5] = "1234";
memcpy(aa, bb, 4);
int len = strlen(aa);
count << aa;
count << bb;
count << "aa Length : " << len;

这里写图片描述

仔细看图片上箭头标注的地方,为什么aa数组显示为“1234…”,而bb数组显示为“1234”,再看看看红色矩形框中的数据。

先看aa数组,箭头所指位置显示为“1234…”这里为什么在1234后面显示省略号呢,原因就是aa数组后面没有字符结束符’\0’,这里的’…’其实就是aa数组后面的数据,其实将aa和bb数组输出就知道发生了什么。

输出:
12341234
1234
aa Length : 8

好了,我们也看到结果了,输出aa数组时将bb数组的值也一起输出了,这是为什么呢?
看一下aa数组和bb数组的地址aa:efd28 与 bb:efd2c ,相差4位,而bb数组的数据在aa数组之后,在输出时因为aa数组没有字符结束符,而bb数组最后一位为’\0’ ,所以输出aa时一直到bb数组的最后一位’\0’结束。同时我们也看到aa数组的长度为8,正如输出字符的长度。

而这里我们确实看到’1’、’2’、’3’、’4’ 这4个字符分别分配给了 aa[0]、aa[1]、aa[2]、aa[3] ,这里通过memcpy方法能够将bb数组中前4个字节的内容拷贝到aa数组中 , 所以通过内存拷贝的方法是可以的,但是直接给aa数组赋值 “1234”在本质上就是不对的。

再看到bb数组,箭头部分显示为“1234”是正确的,矩形方框内末尾一位为’\0’,所以输出bb数组是没有问题的。


那么aa数组的起始地址和bb数组的起始地址是怎么定的呢 ,难道是哪个数组先定义哪个地址就在前吗?

char bb[5] = "1234";
char aa[4];
memcpy(aa, bb, 4);
count << aa;
count << bb;

这里写图片描述

我们看到尽管aa数组定义在了bb数组后面,但是aa数组的地址仍在bb数组前面,关于内存地址如何分配我们下期给予论述。

事例四

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用char型数组过程中遇到的问题 的相关文章

  • EF Core Group By 翻译支持条件总和

    听说 EF Core 2 1 将支持翻译小组 我感到非常兴奋 我下载了预览版并开始测试它 但发现我在很多地方仍然没有得到翻译分组 在下面的代码片段中 对 TotalFlagCases 的查询将阻止翻译分组工作 无论如何 我可以重写这个以便我
  • 我如何才能等待多个事情

    我正在使用 C 11 和 stl 线程编写一个线程安全队列 WaitAndPop 方法当前如下所示 我希望能够将一些内容传递给 WaitAndPop 来指示调用线程是否已被要求停止 如果 WaitAndPop 等待并返回队列的元素 则应返回
  • Asp.NET WebApi 中类似文件名称的路由

    是否可以在 ASP NET Web API 路由配置中添加一条路由 以允许处理看起来有点像文件名的 URL 我尝试添加以下条目WebApiConfig Register 但这不起作用 使用 URIapi foo 0de7ebfa 3a55
  • 如何使用 ICU 解析汉字数字字符?

    我正在编写一个使用 ICU 来解析由汉字数字字符组成的 Unicode 字符串的函数 并希望返回该字符串的整数值 五 gt 5 三十一 gt 31 五千九百七十二 gt 5972 我将区域设置设置为 Locale getJapan 并使用
  • OleDbDataAdapter 未填充所有行

    嘿 我正在使用 DataAdapter 读取 Excel 文件并用该数据填充数据表 这是我的查询和连接字符串 private string Query SELECT FROM Sheet1 private string ConnectStr
  • 重载<<的返回值

    include
  • 仅将 char[] 的一部分复制到 String 中

    我有一个数组 char ch 我的问题如下 如何将 ch 2 到 ch 7 的值合并到字符串中 我想在不循环 char 数组的情况下实现这一点 有什么建议么 感谢您花时间回答我的问题 Use new String value offset
  • Windows 窗体:如果文本太长,请添加新行到标签

    我正在使用 C 有时 从网络服务返回的文本 我在标签中显示 太长 并且会在表单边缘被截断 如果标签不适合表单 是否有一种简单的方法可以在标签中添加换行符 Thanks 如果您将标签设置为autosize 它会随着您输入的任何文本自动增长 为
  • 对现有视频添加水印

    我正在寻找一种用 C 在视频上加水印的方法 就像在上面写文字一样 图片或文字标签 我该怎么做 谢谢 您可以使用 Nreco 视频转换器 代码看起来像 NReco VideoConverter FFMpegConverter wrap new
  • WPF/C# 将自定义对象列表数据绑定到列表框?

    我在将自定义对象列表的数据绑定到ListBox in WPF 这是自定义对象 public class FileItem public string Name get set public string Path get set 这是列表
  • 向现有 TCP 和 UDP 代码添加 SSL 支持?

    这是我的问题 现在我有一个 Linux 服务器应用程序 使用 C gcc 编写 它与 Windows C 客户端应用程序 Visual Studio 9 Qt 4 5 进行通信 是什么very在不完全破坏现有协议的情况下向双方添加 SSL
  • 如何从两个不同的项目中获取文件夹的相对路径

    我有两个项目和一个共享库 用于从此文件夹加载图像 C MainProject Project1 Images 项目1的文件夹 C MainProject Project1 Files Bin x86 Debug 其中有project1 ex
  • 为什么编译时浮点计算可能不会得到与运行时计算相同的结果?

    In the speaker mentioned Compile time floating point calculations might not have the same results as runtime calculation
  • C# 成员变量继承

    我对 C 有点陌生 但我在编程方面有相当广泛的背景 我想做的事情 为游戏定义不同的 MapTiles 我已经像这样定义了 MapTile 基类 public class MapTile public Texture2D texture pu
  • C# 模拟VolumeMute按下

    我得到以下代码来模拟音量静音按键 DllImport coredll dll SetLastError true static extern void keybd event byte bVk byte bScan int dwFlags
  • 如何在文本框中插入图像

    有没有办法在文本框中插入图像 我正在开发一个聊天应用程序 我想用图标图像更改值 等 但我找不到如何在文本框中插入图像 Thanks 如果您使用 RichTextBox 进行聊天 请查看Paste http msdn microsoft co
  • C++ 中类级 new 删除运算符的线程安全

    我在我的一门课程中重新实现了新 删除运算符 现在我正在使我的代码成为多线程 并想了解这些运算符是否也需要线程安全 我在某处读到 Visual Studio 中默认的 new delete 运算符是线程安全的 但这对于我的类的自定义 new
  • C++ 标准是否指定了编译器的 STL 实现细节?

    在写答案时this https stackoverflow com questions 30909296 can you put a pimpl class inside a vector我遇到了一个有趣的情况 这个问题演示了这样一种情况
  • 如何防止用户控件表单在 C# 中处理键盘输入(箭头键)

    我的用户控件包含其他可以选择的控件 我想实现使用箭头键导航子控件的方法 问题是家长控制拦截箭头键并使用它来滚动其视图什么是我想避免的事情 我想自己解决控制内容的导航问题 我如何控制由箭头键引起的标准行为 提前致谢 MTH 这通常是通过重写
  • 使用.NET技术录制屏幕视频[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有没有一种方法可以使用 NET 技术来录制屏幕 无论是桌面还是窗口 我的目标是免费的 我喜欢小型 低

随机推荐

  • 阿里员工离职换来一条血泪教训:以为当小白兔很安全,是你对职场最大的误解

    大家好 我是彭于晏 最近跟一些朋友见面 提起阿里辞退员工中 很多是职场小 老 白兔 看似温和 其实是组织中的祸患 这让我想起马云在湖畔大学首堂课上曾分享 小公司的成败在于你聘请什么样的人 大公司的成败在于你开除什么样的人 大公司里有很多老
  • 【C++】5、构建:CMake

    文章目录 一 概述 二 实战 2 1 内部构建 外部构建 2 2 CLion Cmake 一 概述 CMake 是跨平台构建工具 其通过 CMakeLists txt 描述 并生成 native 编译配置文件 在 Linux Unix 平台
  • vc2010使用libcurl静态库遇到连接失败的解决方案

    vc2010使用libcurl静态库 遇到连接失败的解决方案 2010 11 10 15 35 下载libcurl的源码 打开lib文件夹下项目 编译为静态链接库 在编译的时候出现问题如下 注 以前在vc2005下用mfc工程并且libcu
  • char型int型float型double型数组在内存中所占的字节数(16位、32位、64位PC机)

    在C语言中 以16位PC机为例 一个char型数据在内存中所占的字节数为1 一个int型数据在内存中所占的字节数为2 一个float型数据在内存中所占的字节数为4 一个double型数据在内存中所占的字节数为8
  • ThreadPool 线程池

    ThreadPool 线程池 1 例子 MyThreadPoolDemo 2 为什么用线程池 3 线程池如何使用 4 线程池几个重要参数 5 线程池底层工作原理 6 线程池用哪个 生产中如设置合理参数 一 MyThreadPoolDemo
  • Oracle数据库远程连接配置教程

    本人前一段时间做过Oracle数据库的相关工作 但是发现数据库的监听程序和服务名比较难搞定 而且网上也没有现成的教程 所以经过自己的探索之后将这片文章贡献给大家 如有不当之处还请谅解并请联系本人 此配置是在本机允许访问的前提下进行 如不允许
  • typescripe第二天—返回类型和注解

    函数参数类型和返回类型定义 简单类型定义 如下图 getTotal没有给它定义返回值类型 虽然被推断出了返回值是number类型 但如图所示 有string存在时 并未报错 可以直接给total一个类型注解 但错误的根本是getTotal
  • Android 11 WebView 打开html文件,加载时报错:ERR_ACCESS_DENIED

    问题描述 之前andorid 10上做的需求 移植到android 11上 在项目中 system app HTMLViewer 自定义的加载html的xxxActivity java文件访问 手机系统中的 system etc html
  • 不使用MFC AppWizard向导, 如果没有设置好项目参数, 编译时产生错误及解决办法

    转贴 在创建MFC项目时 不使用MFC AppWizard向导 如果没有设置好项目参数 就会在编译时产生很多连接错误 如error LNK2001错误 典型的错误提示有 libcmtd lib crt0 obj error LNK2001
  • 频分复用和时分复用

    频分复用 FDM Frequency Division Multiplexing 就是将用于传输信道的总带宽划分成若干个子频带 或称子信道 每一个子信道传输1路信号 频分复用要求总频率宽度大于各个子信道频率之和 同时为了保证各子信道中所传输
  • 【深入理解C++】类对象所占用的空间大小

    文章目录 1 须知 2 非静态成员变量 普通成员变量 3 静态成员变量 4 非静态成员函数 普通成员函数 5 静态成员函数 6 构造函数和析构函数 1 须知 类本身是没有大小的 类的大小指的是类的对象所占的大小 如果用 sizeof 运算符
  • 十个不错的 Linux 网络监视工具

    点击上方蓝字 快速关注我们 英文 Linuxandubuntu 编译 LCTT https linux cn article 9153 1 html 保持对我们的网络的管理 防止任何程序过度使用网络 导致整个系统操作变慢 对管理员来说是至关
  • 毕业设计-基于机器学习的新冠肺炎疫情预测精度研究

    目录 前言 课题背景和意义 实现技术思路 一 国内新冠肺炎疫情的统计分析 二 基于机器学习模型的新冠肺炎疫情研究 三 基于深度学习模型的新冠肺炎疫情研究 实现效果图样例 最后 前言 大四是整个大学期间最忙碌的时光 一边要忙着备考或实习为毕业
  • CentOS 7 搭建CA证书服务器

    一 实验环境 CA 192 168 199 141 Apache 192 168 199 143 二 实验步骤 1 CA证书服务器的配置 1 1 安装openssl工具 默认使安装完成的 root CA yum install y open
  • 十进制转8421_BCD码

    目录 一 BCD码简介 二 十进制转8421BCD码转换思路 三 程序编写 四 仿真验证 总结 一 BCD码简介 BCD码 Binary Coded Decimal 用4位二进制数来表示1位十进制数中的0 9这10个数码 是一种二进制的数字
  • JAVASCRIPT调用WEBSERVICE

    HTML端代码
  • inno setup打包脚本总结

    inno setup是比较简单好用的一款打包工具 下面以打包HelloWorld exe为例进行说明 一 打包目录的建立 创建source目录 用于放置主程序 依赖dll 资源等待打包文件 创建output目录 用于存放生成的安装包 Hel
  • BRDF详解(包括:irradiance,radiance,intensity,立体角)

    BRDF BRDF是双向反射分布函数 Bidirectional Reflectance Distribution Function BRDF 用来定义给定入射方向上的辐射照度 irradiance 如何影响给定出射方向上的辐射率 radi
  • 将GAN用于语义分割

    深度学习已经在图像分类 检测 分割 高分辨率图像生成等诸多领域取得了突破性的成绩 但是它也存在一些问题 首先 它与传统的机器学习方法一样 通常假设训练数据与测试数据服从同样的分布 或者是在训练数据上的预测结果与在测试数据上的预测结果服从同样
  • 使用char型数组过程中遇到的问题

    简述 最近开发中用到了char数组来接收数据 在使用中遇到了一些问题 这里记录一下 同时也回顾一下char数组的用法 代码之路 事例一 char aa 0 首先 我们要知道 0长度的数组在ISO C和C 的规格说明书中是不允许的 用VS20