狡诈恶徒 发表于 2023-1-16 21:09:47

关于字符拼接的问题,缓存区溢出

#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感觉更好上手一些。但是经常发生和视频里不一样的错误。。。

ba21 发表于 2023-1-16 21:36:48

不同编译器严格性不一样。这很正常。
#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;
}

小mi糊 发表于 2023-1-16 21:57:18

str1开辟的空间大小是该字符串说占用的空间,也就是7个字节
,strcat()追加字符串时,没有空间了,就报错了

// 在VS中代码第一行加入

#pragma warning(disable:4996)
//就可以使用strcat、scanf

小mi糊 发表于 2023-1-16 22:03:49

这里是str1在未指定数值长度时在内存开辟的空间

两手空空儿 发表于 2023-1-17 17:48:25

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 18:08:41

两手空空儿 发表于 2023-1-17 17:48
3楼的兄弟已经说的很清楚了

所以我把strcat_s函数的第二个参数写成 sizeof(str1)+1 ,试图加一个字节把空格放进去。但是这个空间的大小不能中途改变,结果依旧越界。(应该是这样吧{:9_241:}

两手空空儿 发表于 2023-1-18 09:24:12

狡诈恶徒 发表于 2023-1-17 18:08
所以我把strcat_s函数的第二个参数写成 sizeof(str1)+1 ,试图加一个字节把空格放进去。但是这个空间的大 ...

是的,数组声明以后长度就固定了,不能改变,存储内容发生变化的数组,要预留足够的空间防止越界。
要想使用可变长度的空间,就用动态申请内存的方式
malloc , calloc 这样的函数
页: [1]
查看完整版本: 关于字符拼接的问题,缓存区溢出