在字符串中复制地址时的奇怪行为

时间:2015-11-23 19:34:05

标签: c string pointers

#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

我运行的每个编译器的字符串长度总是不同的。虽然指针每次都相同。不知道为什么。因为长度不同,所以字符串也不匹配。

1 个答案:

答案 0 :(得分:0)

那是因为sprintf(str1,"%20.20p",p);会在str1中打印超过20个符号,因此代码中会出现缓冲区溢出 - 第一个printf打印到str1 {}}和str2的一部分,第二个printf覆盖str2内的部分。

它实际打印0x0000000000000173d010,这是23个符号,最后包括零个字符。