strcat函数越界的问题

不使用strcat函数,自己编程实现把两个字符串连接起来的程序(最终字符串长度限制在100个字符以内)。以下是部分代码,请完成并提交。 不使用strcat函数,自己编程实现把两个字符串连接起来的程序(最终字符串长度限制在100个字符以内)。以下是部分代码,请完成并提交。 #include <stdio.h> int main(){ char a[100],b[100]; int i,j; gets(a);//输入字符串a gets(b);//输入字符串b //下面代码把b连接到a的后面 … … puts(a);//输出... 阅读详情

首先,这是一个非常有趣的问题!
我也是最近看了一本《C++高效编程:内存与性能优化》的书才弄明白其中的奥秘!
我们先来看一个“奇怪”的现象:

CODE:

        struct A { char a; long b; char c; long d; };
        struct B { char a; char c; long b; long d; };

        cout << sizeof(A) <<endl;
        cout << sizeof(B) <<endl;
按照常理,输出都应该是 10 ,其实实际运行结果是16,12 !是不是很奇怪???

为什么会出现这个现象呢?因为编译器会强制char类型的变量与long类型的变量在内存中对齐!


举例看结构A在内存中的布局如下:

地址   内 容
00     字符a
01     未用
02     未用
03     未用
04     long b, byte 0
05     long b, byte 1
06     long b, byte 2
07     long b, byte 3
08     字符c
09     未用
......
可以看到其中的原因了吧!

再看看LZ的程序的原因。
C++的系统函数strcat()的功能只是简单的拼接字符串,自身没有检测是否越界的功能!所以,当拼接后的新的字符串长度大于原始的空间时,strcat()会修改邻接的内存空间!所调用strlen()所取得的长度是截止到 '/0' 的长度!但是调用sizeof()会发现其空间大小还是10!
按照上面的说法,字符数组a后面的空间应该被修改,所以b的内容会变化,但是C++编译器分配内存空间是按照倒栈的顺序的,如果把b放到a前面定义,才有可能被修改!但是由于开始说的内存对齐问题的存在,因此字符数组b的内容还是没有被改变。


大家可以看看下面的程序,分别输出a,b的地址。

CODE:

int main(){

    char b[10] = "good";
    char a[10] = "java is";
    strcat(a," ");
    strcat(a,b);
    cout << int(&b) << endl;
    cout << int(&a) << endl;

    return 0;
}
运行结果为:

2293600
2293584


(该运行结果取决于不同的机器与编译器,但是反映的问题还是很明显的!)

a,b的头地址相距16Byte,而a的默认空间只有10Byte,还有6Byte的空间是什么呢?
当执行strcat()时,越界的部分就覆盖了这6Byte的内容,但是还没有影响到b的内容,为了证明strcat()确实存在越界的问题,我们可以构造一个特例,程序如下:

CODE:

int main(){

    char b[30] = "good, but i don't think so!";
    char a[10] = "Java is";
    strcat(a," ");
    strcat(a,b);
    cout<<a<<endl;
    cout<<b<<endl;
    cout << int(&b) << endl;
    cout << int(&a) << endl;

    return 0;
}
我们把b放得足够大,然后调用strcat(),使得拼接后的字符串的长度大于16,这样的话,不仅仅是a,b之间的6Byte被覆盖,b的内容也被覆盖了!
程序运行结果如下:

Java is good, but i don't think so!
t i'dont think so!

可以看到,越界是存在的!

最后总结一下:
strcat()存在越界的问题,因此我们在使用该函数之前需要确保目标字符数组的空间足够大!在原始的程序中,由于变量较少,运行似乎没错,但是还是有很严重的BUG的!

标准库函数strcat 引起数组越界操作的分析与解决方法 前言 在使用字符串连接时,可能会想到:C标准库函数<string>中的:strcat strcat 需要注意目标字符串的长度,否则,不正确的使用,会引起数组的越界 测试例程 如下,执行:strcat_test时,发现了数组的越界,把其他内存的数据破坏了 void strcat_test(void) { uint32_t cnt = 0; char name0[8] = { 'a', '0' }; char name1[8] = { 'a', ' 阅读详情

相关推荐

overleaf导入模板

本文介绍了如何在Overleaf平台导入Springer Nature模板。首先下载所需的模板压缩包,然后在Overleaf中选择"Upload project"上传该压缩包。上传后会显示模板文件,包括EPS格式图像文件、LaTeX源文件、BibTeX参考文献文件、PDF输出文件以及文档类文件。这些文件共同构成了完整的LaTeX模板,可用于学术论文写作和排版。

A2787960542的博客 1148

那为啥书上说str1必须足够长?

今天遇到一个问题 strcat(str1,str2)中:如果str1不够长的话,会怎样?(是不是只会连接一部分str2的内容啊?) 答案是:如果str1不够长,那么该程序可能会出现bug 来直接看结果 可见,虽然给str1申请的长度小于str1+str2的长度,不过仍然是可以连接上的 尽管多运行几次,答案仍然是一样 这是可以运行,并且能拿到预期的结果,只不过程序有可能会出现bug 下面讲原理 此时我们给str1和str2申请的长度都是20,申请的空间是占用内存的,就大概是这样 strcat 函数复

qq_44769557的博客 1124

TPAMI 2025新作LRFormer复现笔记:我的Windows 11 + RTX 4090配置全流程

本文详细记录了在Windows 11系统下使用RTX 4090显卡复现TPAMI 2025顶会论文LRTransformer的完整流程,包括硬件配置、系统优化、Python环境搭建及模型训练中的常见问题解决方案。特别针对Windows平台特有的路径管理、CUDA版本冲突和显存优化等关键技术细节提供了实用指南,帮助开发者高效完成环境搭建和模型训练。

weixin_29094301的博客 412

小心使用strcpy函数时越界

strcpy()函数应该是我们用的比较常用的一个函数,基本功能是将一个字符串拷贝到我指定的内存空间。但是要复制的字符串长度超过这段内存空间的话,结果可能是未知的。 比如以下的程序: #include <stdio.h> #include <string.h> int main(int argc, char *argv[]) { int flag...

dichen3940的博客 855

RK3566基于Buildroot定制QT开发环境的完整指南

本文详细介绍了如何在RK3566开发板上使用Buildroot定制QT开发环境的完整流程。从基础环境搭建、Buildroot初始配置到QT模块选择与编译验证,提供了实战经验和常见问题解决方案,帮助开发者高效完成嵌入式Linux下的QT开发环境部署。

weixin_26804345的博客 358

计算机视觉:暗通道去雾算法的原理及python实现

在绝大多数非天空的局部区域中,某些像素总会至少有一个颜色通道的值很低。对于一幅图像J(x),其暗通道的数学定义表示如下:其中,Ω(x)表示以x为中心的局部区域,上标c表示RGB三个通道。该公式的意义用代码表达也很简单,首先求出每个像素RGB分量中的最小值,存入一副和原始图像大小相同的灰度图中,然后再对这幅灰度图进行最小值滤波,滤波的半径由窗口大小决定。

weixin_51998427的博客 1万+

C:strlen()、strcat()、strncat()

C:部分字符串函数备忘

u012951679的博客 369

【Matlab深度学习】GPU加速实战:从环境配置到性能优化

本文详细介绍了如何在Matlab中为深度学习任务配置GPU加速环境并进行性能优化。文章从GPU加速的必要性讲起,手把手指导安装NVIDIA驱动、CUDA和cuDNN核心三件套,并验证环境。重点讲解了如何利用gpuArray将数据和模型迁移至GPU,以及通过内存优化、计算优化和多GPU并行等策略充分释放GPU算力,大幅缩短深度学习模型的训练时间。

weixin_29061465的博客 491

字符串拼接strcat函数越界问题

今天在完成需求的过程中,遇到了将两个字符串拼接在一起,然而这两个字符串要是以普通的数组形式存储使用strcat函数是没问题的,但是用到了指针的话,就需要开辟一个新的指针作为中介,再将两个指针分配赋值即可 ...

程序员小嗨 1204

手把手教你学GPU的KMD专栏--2.4 GPU固件加载与初始化流程

GPU固件(Firmware)是嵌入在GPU芯片ROM或EEPROM中的低级代码,是GPU启动时首先执行的程序。它负责GPU硬件的基础初始化和基本功能配置,是GPU与操作系统之间的"第一道桥梁"。与操作系统驱动不同,固件在CPU启动后、操作系统加载前就已执行,是硬件层面的"启动代码"。关键认知:GPU固件是GPU的"BIOS",没有它,GPU硬件无法进入可操作状态。就像CPU需要BIOS来初始化内存和外设一样,GPU需要固件来初始化其核心组件。

MHD0815的博客 112

如何合理评估信号过孔的残桩效应--Via Stub

设计中,之所以会去考察信号过孔的残桩效应(Via Stub),是因为它的存在导致了不需要的频率谐振,当这些谐振出现在所关注的信号通道的插入损耗中时,就会引发较为严重的信号完整性(SI)问题,那么Via Stub到底是如何引发SI问题的呢?

一只豌豆象的博客 4466

strcat 引发的思索

学过c的人,对这个strcat函数应该不会陌生吧, 其原型为extern char * strcat(char* str1,char* str2) 作用是连接str1和str2 ,并返回连接后的str1字符串。 在vs2005后,ms提供了更为安全的字符串连接:strcat_s; 为什么说strcat_s 更为安全那? 1、strcat 不会检测str1内存空间是否会越界 2、strc

小牛‘s Target 1602

基于扣子3.0复刻MIT“AI股神团队版”:实时股票数据API接入与策略选股复盘系统

基于扣子3.0的AI量化投资系统摘要 本文提出了一种基于扣子(Coze)3.0平台的AI量化投资解决方案,整合实时股票数据与策略选股功能。系统采用三层架构: 数据层:通过AKShare等开源工具获取A股实时行情和历史K线数据,支持批量数据抓取和清洗 策略层:内置多因子选股模型和技术指标分析模块,实现自动化标的筛选 应用层:利用扣子3.0的插件和工作流功能,构建从数据采集到投资建议的完整流程 系统特点包括:完全开源的数据接入方案、Python实现的策略计算模块、以及扣子平台提供的可视化编排能力~~~~~~~~

huanghm88的专栏 267

字符串处理,注意越界问题

strcpy(char *dest, char *src);注意越界问题 dest(空间大小) > src(串的长度)  没有问题 dest == src               不是字符串,且产生了越界 dest strncpy(char *dest, char *src, int n);注意越界问题与字符串问题 dest(指向空间大小) > n   则结果dest是一个字符

u012385733的专栏 2647

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

字符串常用库函数——strcat

strcat(字符拼接函数),其函数原型为 char* strcat(char *s1,const char *s2),功能就是s2指向的字符串追加到s1指向的字符串中间去,同时去掉s1中的‘\0’,传递s2中的’\0’。strcat函数在使用时跟strcpy函数一样,要求s1指向的剩余空间要大于s2指向的空间,否则在值传递过程中会导致空间越界访问,从而使程序崩溃。此时程序能够输出预期结果,但是已经产生了越界访问,引发报警。#四.函数实现my_strcat。

weixin_44295115的博客 565

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

c++:strcat潜在的错误不报告

#include #include using namespace std; int main() { char a[]="hello"; char b[]="world"; cout strcat(a,b); cout cout } 运行结果: 5 helloworld 10 这个小程序中数组a的大小被改变了,但是可以正常运行。潜在的错误影响呢

crazyhacking的专栏 1704

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

strcat()函数常见问题

  strcat(char *_Destination,const char *_Source)函数的功能是将后一个字符串粘贴到前一个字符串的末尾 原型   char *strcat(char *_Destination,const char *_Source) 常见错误   strcat函数常见的错误就是数组越界,即两个字符串连接后,长度超过第一个字符串数组定义的长度,导致越...

weixin_30236595的博客 1145

C语言实现strcat

1.strcat介绍 strcat --- 字符串追加 char * strcat ( char* destination, const char* source ); 源头字符串与目的地字符串必须都以’\0‘结束; 目标空间必须足够大且可修改 2.如何使用 strcat的追加是从目的地字符串的‘\0’开始追加;追加时源头字符串的‘\0’会追加到目的地,而目的地的‘\0’被源头字符串的第一个字符所取代 错误示范: char arr1[] = "hello" ; // arr1数组空间

Hello_World_213的博客 2742

【C学习-踩坑记录】使用strcat();函数后,程序后边的代码不执行

错误代码 #include &lt;stdio.h&gt; #include &lt;memory.h&gt; int main(void) { char arr1[] = "hello"; char arr2[] = "world"; printf("---------\n"); strcat(arr1, arr2); // **以下代码不会执行**...

Good morning的博客 714

c语言8选6问题,c语言入门6-8中strcat长度问题

onemoo因为 strcat 函数在复制时是通过指针来进行的,你可以想像成这个函数只是用指针将第二个参数字符串中的字符一个一个地复制到第一个参数的字符串尾部后面...(基本上这个函数的实现就是这样的)。所以实际上函数根本就不知道这两个参数所指的内存空间到底有多大,也就是说函数不会因为这两个数组不够大而主动给你报错,它只会依次复制字符,就算写过界也不知道。 这样的代码在语法层面没有错,所以是可以...

weixin_35171603的博客 342

c语言实现函数,解决dest的初始化和内存越界的问题

c语言实现函数,增加STRCPY、STRNCPY、STRCAT、STRNCAT四个安全的函数,弥补库函数的缺陷,解决dest的初始化和内存越界的问题。注意,上述函数的第二个参数destsize是第一个参数dest占用内存的字节数。

qq_45666522的博客 200

c语言strcat函数怎么用,strlcat C语言strcat函数怎么用

C语言strcat函数怎么用char a[]; scanf("%s",a); strcat(a,".txt"); FILE *fp=fopen(a,"w"); f用法: #include 在C++中,则存在于头文件中。 strcat原型: extern char *strcat(char *dest,char *src); 功能: 把src所指无法定位程序输入点sdl strlcat于动态链接库s...

weixin_30284125的博客 1101

【string总结之三】C语言strcat/strncat

C语言string的几个函数虽然比较简单, 但是还是想总结在这里, 以免每次用到都要去查一下 strtol,strstr,strcat/strncat,strcpy/strncpy,strcmp/strncmp 1.strcat 【头文件与函数原型】 #include <string.h> char *strcat(char *dest, const char *src); ...

liaojunwu的博客 439

C++ 实现strlen,strcpy,strcat等函数

通过实现这些函数,让我明白写一个简单的函数其实也要考虑一些问题的,最基本的函数参数的合法性,使用全局变量,全局函数等的合法性。而且写代码时要细心,在for循环语句中,循环次数很容易搞错,导致数组操作越界或指针访问越界。   strlen的实现: size_t myStrlen(const char *str) { assert(str !=NULL); size_t len=0;

享受开发技术,享受计算机科学 1149

C语言随笔(strcat的实现)

今天看C语言教程的时候,看到有关指针,字符串数组

gwbbigbang的专栏 891
上一篇: C++字符串内部查找函数
下一篇: JDBC连接数据
sendfeng
博客等级 码龄20年 5粉丝 23原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值