1. 现象
在进行内存操作之后,使用 *printf(“%s”)* 打印,发现memcpy会有概率输出超过预料长度的字符串,特别记录。
2.现象
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void main()
{
char *str;
str = malloc(5);
memset(str,'k',5); //所有地址填充为k
memcpy(str, "ade",3);
printf("str:%s\n", str);
for(int i = 0; i<10; i++)
{
printf("c:%d ",*(str+i));
}
getchar();
}
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void main()
{
char *str;
str = malloc(5);
memset(str,'k',5); //所有地址填充为k
strcpy(str, "ade");
printf("str:%s\n", str);
for(int i = 0; i<10; i++)
{
printf("c:%d ",*(str+i));
}
getchar();
}
3.分析
printf(“%s”) 会一直打印到 ‘/0’为止;
strcpy 会将字符串末尾的 ‘/0’一并复制到目标地址–数据正常打印,但是有可能会溢出(当malloc分配的内存空间与源字符串大小刚好相等时,字符串末尾的’/0’溢出);
memcpy只会复制指定数量的数据到目标地址–不会溢出,但是有可能将相邻的非空数据打印出来;
4.结语
这里讨论的是 “%s” 打印 和 内存分配需要注意的点,以及在复制的时候需要注意溢出的问题,正常的溢出在网上叙述的很详细了,本处就不啰嗦了。