鱼C论坛

 找回密码
 立即注册
查看: 1038|回复: 6

[已解决]学C S1E19关于“strcat()”的基础问题

[复制链接]
发表于 2022-1-8 17:53:13 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include <stdio.h>
#include <string.h>

int main()
{
        char test[11] = "contacting";
        char chars[9] = "fighting";

        strcat(test,chars);

        printf("字符串的大小是:%d\n",sizeof(test));
        printf("字符串长度:%d\n",strlen(test));
        printf("字符串内容是:%s\n",test);

        return 0;
}
代码如上
我的理解是使用连接函数之后的“sizeof(test)”会变成原来的“sizeof(test)+sizeof(chars)”-1,长度则为“sizeof(test)+sizeof(chars)”-2。
但最后输出的结果如下:
“字符串的大小是:11
字符串长度:18
字符串内容是:contactingfighting”
字符串长度符合猜想,但为什么字符串的大小没有发生改变呢?
麻烦了!

最佳答案
2022-1-8 23:36:34
TerenceL 发表于 2022-1-8 22:59
意思是字符串的大小在定义时就固定下来了吗?不太理解为什么超出字符串大小的内容还是能够被读取并输出呢 ...

c/c++ 不会对数组进行越界检测,意思是有可能出现你所描述的现象,但是这样不安全,因为你不知道数组后面的内存单元是否已经被使用,如果被使用,就会溢出报错,如果没有被使用,就会出现你那种情况。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-1-8 18:47:50 | 显示全部楼层
本帖最后由 傻眼貓咪 于 2022-1-8 18:50 编辑

可以的话,不要这样做(故意输入比原先定义的大小更长的字符串)。
定义字符串的大小时,尽量考虑到后面变长后的长度,你的代码已经定义长度为 11 了,事实上一些编译器这里已经报错了:*** stack smashing detected ***: terminated

如同:
#include <stdio.h>

int main()
{
    char str[5];
    fgets(str, 10, stdin);
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-1-8 22:59:22 | 显示全部楼层
傻眼貓咪 发表于 2022-1-8 18:47
可以的话,不要这样做(故意输入比原先定义的大小更长的字符串)。
定义字符串的大小时,尽量考虑到后面变 ...

意思是字符串的大小在定义时就固定下来了吗?不太理解为什么超出字符串大小的内容还是能够被读取并输出呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-8 23:36:34 | 显示全部楼层    本楼为最佳答案   
TerenceL 发表于 2022-1-8 22:59
意思是字符串的大小在定义时就固定下来了吗?不太理解为什么超出字符串大小的内容还是能够被读取并输出呢 ...

c/c++ 不会对数组进行越界检测,意思是有可能出现你所描述的现象,但是这样不安全,因为你不知道数组后面的内存单元是否已经被使用,如果被使用,就会溢出报错,如果没有被使用,就会出现你那种情况。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-1-9 07:45:34 | 显示全部楼层
傻眼貓咪 发表于 2022-1-8 23:36
c/c++ 不会对数组进行越界检测,意思是有可能出现你所描述的现象,但是这样不安全,因为你不知道数组后面 ...

我尝试了不加\0,字符串也能够被正常输出。这也是c没有越界检测的原因吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-9 10:14:11 | 显示全部楼层
TerenceL 发表于 2022-1-9 07:45
我尝试了不加\0,字符串也能够被正常输出。这也是c没有越界检测的原因吗?

编译器会在字符串后面自动添加结尾符
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-1-9 10:38:50 | 显示全部楼层
#include <stdio.h>
#include <string.h>

int main()
{
        char test[10] = "contacting";

        printf("字符串内容:%s\n",test);

        return 0;
}
代码如上
字符串test[10]应该是没有内存摆放‘\0’的,但仍能够正常输出,是因为C语言不会进行越界检测且其后内存单元恰好没有被使用的原因吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-18 18:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表