#include<stdio.h>
#include<malloc.h>
#include<string.h>
int main()
{
int *p = (int *)malloc(4 * sizeof(int));
char str1[20] ;
char str2[20] ;
sprintf(str1,"%20.20p",p);
sprintf(str2,"%20.20p",p);
printf("%d\t%20.20s\n",strlen(str1),str1);
printf("%d\t%20.20s\n",strlen(str2),str2);
if(strcmp(str1,str2) == 0)
printf("SAME\n");
else
printf("DIFFERENT\n");
free(p);
return 0;
}
输出:
42 0x000000000000083bc0
22 0x000000000000083bc0
DIFFERENT
我运行的每个编译器的字符串长度总是不同的。虽然指针每次都相同。不知道为什么。因为长度不同,所以字符串也不匹配。
答案 0 :(得分:0)
那是因为sprintf(str1,"%20.20p",p);
会在str1
中打印超过20个符号,因此代码中会出现缓冲区溢出 - 第一个printf
打印到str1
{}}和str2
的一部分,第二个printf
覆盖str2
内的部分。
它实际打印0x0000000000000173d010
,这是23个符号,最后包括零个字符。