int main()
{
printf("\n");//第一个printf
char *mem = malloc(sizeof (char)*16);
memcpy(mem,"hellodddddddddddd",123);
printf("\n");//第二个printf
return 0;
}
意外发现,当memcpy越界时,运行代码不会崩溃,此时没有写两个 ‘printf’函数,,当添加第二个printf函数,关闭第一个printf时,代码运行到第二个printf 就会崩溃;当“开启”两个prinf时,代码不会崩溃。
崩溃时,gdb bt命令查看结果:
发现,printf 内部有执行 _int_malloc,怀疑printf会在堆栈 申请内存 导致与越界拷贝的数据冲突,因为崩溃。如此判断,还因为memcpy(mem,"hellodddddddddddd",123); 改拷贝数量改小 到一定程度,有时会不崩溃。 (暂无法深究)
printf确实会使用malloc(堆区的内存)内存:如图 前三个aabbcc 是 保存到内存的,当执行printf时,4320 位置 的内存 会保存prinff输出的内容,oa为换行符。
完整代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char **s = malloc(sizeof (char)*3);
memset(s,0,sizeof (char)*3);
for(int i= 0;i<3;i++){
s[i] = malloc(sizeof (char)*10);
}
for(int i= 0;i<3;i++){
memcpy(s[i],"aaabbb",6);
}
printf("\n");
for(int i= 0;i<3;i++){
printf("%s\n",s[i]);
}
for(int i= 0;i<3;i++){
free(s[i]);
}
free(s);
printf("bye!\n");
return 0;
}
可能不是printf的原因,越界时,程序崩溃好像时随机的,比如我又遇到了这样的:在大括号处崩溃了
要明白的一个点:越界发生的时刻,程序并不会立马崩溃,可能会随机在某行代码处崩溃。比如上述的memcpy越界
参考:越界踩坑这几篇文章