代码
int main(void)
{
char st[2]="";
// printf("%d",findStr("this is a","this is a",5));
scanf("%10[^\n]s",st);
printf("%s",st);
}
输出
vsc> .\findstr.exe
1234567890
1234567890
scanf("%10[^\n]s",st);
scanf接收10个数,但是st数据长度只有2个,不会发生溢出的问题吗?
代码
int main(void)
{
char st[2]="";
// printf("%d",findStr("this is a","this is a",5));
scanf("%10[^\n]s",st);
printf("%s",st);
}
输出
vsc> .\findstr.exe
1234567890
1234567890
scanf("%10[^\n]s",st);
scanf接收10个数,但是st数据长度只有2个,不会发生溢出的问题吗?
当然会溢出呀,这是 C 语言开发中最经常出现的 bug 之一,内存访问越界,而且不易排查。
char st[2];
在栈空间申请两字节内存空间,那么操作系统仅保证这两个字节交给用户不再分配给其它所用,但不保证后面的内存空间中是否被其它地方分配使用,里面是否有值当写入了“不属于”我们的内存空间:
从最上面两条可以看出,这个 bug 是非常难排查的,而且编译器无能为了(因为是运行时错误),只能靠开发人员编码时注意
为了一定程序避免解决这个问题,后面出现了
scanf
的衍生scanf_s
memcpy
👉memncpy
strcpy
👉strncpy
输出:(32位 gcc 编译器)
注意:
st_back
位于st
代码之上