关于字符拼接的问题,缓存区溢出
#include<stdio.h>#include<string.h>
int main()
{
char str1[] = "I love";
char str2[] = "FishC.com!";
strcat_s(str1,sizeof(str1)+1, " ");
strcat_s(str1,sizeof(str1)+sizeof(str2), str2);
printf("%s\n", str1);
return 0;
}
strcat_s(str1,sizeof(str1)+1, " ");//问题在这一行:为什么写入str1时缓冲区会溢出呢?
跟着b站上视频学到这里,用的是vs2022,和gcc编译器用命令行操作相比,vs感觉更好上手一些。但是经常发生和视频里不一样的错误。。。
不同编译器严格性不一样。这很正常。
#include<stdio.h>
#include<string.h>
int main()
{
char str1 = "I love"; // 目标空间必须足够大
char str2[] = "FishC.com!";
strcat_s(str1, sizeof(str1), " "); // 中途不能改变它的大小
strcat_s(str1, sizeof(str1), str2);// 中途不能改变它的大小
printf("%s\n", str1);
return 0;
}
str1开辟的空间大小是该字符串说占用的空间,也就是7个字节
,strcat()追加字符串时,没有空间了,就报错了
// 在VS中代码第一行加入
#pragma warning(disable:4996)
//就可以使用strcat、scanf
这里是str1在未指定数值长度时在内存开辟的空间 3楼的兄弟已经说的很清楚了
char str1[] = "I love"; //这句执行完 str1的长度就固定了,占用7个字节
strcat_s(str1,sizeof(str1)+1, " "); //这句是把长度为8个字节的字符数组赋值给只有7个字节空间的字符数组,越界!
strcat_s(str1,sizeof(str1)+sizeof(str2), str2);// 这一句同理,也是越界的
只要str1足够长,就不会越界,可以直接给str1足够的长度, 定义时char str1;
两手空空儿 发表于 2023-1-17 17:48
3楼的兄弟已经说的很清楚了
所以我把strcat_s函数的第二个参数写成 sizeof(str1)+1 ,试图加一个字节把空格放进去。但是这个空间的大小不能中途改变,结果依旧越界。(应该是这样吧{:9_241:} 狡诈恶徒 发表于 2023-1-17 18:08
所以我把strcat_s函数的第二个参数写成 sizeof(str1)+1 ,试图加一个字节把空格放进去。但是这个空间的大 ...
是的,数组声明以后长度就固定了,不能改变,存储内容发生变化的数组,要预留足够的空间防止越界。
要想使用可变长度的空间,就用动态申请内存的方式
malloc , calloc 这样的函数
页:
[1]