学C S1E19关于“strcat()”的基础问题
#include <stdio.h>#include <string.h>
int main()
{
char test = "contacting";
char chars = "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 18:50 编辑
可以的话,不要这样做(故意输入比原先定义的大小更长的字符串)。
定义字符串的大小时,尽量考虑到后面变长后的长度,你的代码已经定义长度为 11 了,事实上一些编译器这里已经报错了:*** stack smashing detected ***: terminated
如同:#include <stdio.h>
int main()
{
char str;
fgets(str, 10, stdin);
return 0;
} 傻眼貓咪 发表于 2022-1-8 18:47
可以的话,不要这样做(故意输入比原先定义的大小更长的字符串)。
定义字符串的大小时,尽量考虑到后面变 ...
意思是字符串的大小在定义时就固定下来了吗?不太理解为什么超出字符串大小的内容还是能够被读取并输出呢? TerenceL 发表于 2022-1-8 22:59
意思是字符串的大小在定义时就固定下来了吗?不太理解为什么超出字符串大小的内容还是能够被读取并输出呢 ...
c/c++ 不会对数组进行越界检测,意思是有可能出现你所描述的现象,但是这样不安全,因为你不知道数组后面的内存单元是否已经被使用,如果被使用,就会溢出报错,如果没有被使用,就会出现你那种情况。 傻眼貓咪 发表于 2022-1-8 23:36
c/c++ 不会对数组进行越界检测,意思是有可能出现你所描述的现象,但是这样不安全,因为你不知道数组后面 ...
我尝试了不加\0,字符串也能够被正常输出。这也是c没有越界检测的原因吗? TerenceL 发表于 2022-1-9 07:45
我尝试了不加\0,字符串也能够被正常输出。这也是c没有越界检测的原因吗?
编译器会在字符串后面自动添加结尾符 #include <stdio.h>
#include <string.h>
int main()
{
char test = "contacting";
printf("字符串内容:%s\n",test);
return 0;
}
代码如上
字符串test应该是没有内存摆放‘\0’的,但仍能够正常输出,是因为C语言不会进行越界检测且其后内存单元恰好没有被使用的原因吗?
页:
[1]