sprintf影响数组的返回值

时间:2013-09-19 07:25:08

标签: c return-value printf

#include<stdio.h>

int main(){

 unsigned char array[]={0xff,0xd8,0xff,0xe0};
 char names[7];
 int count=1;
  sprintf(names,"%03d.jpg",count);
  for(int i=0;i<4;i++){
   printf("%#x  ",array[i]);
  }
  printf("\n");
 return 0;
}

字符数组受到sprintf的返回值的影响,这里的7。我使用gdb来查找此错误。
如何摆脱这个问题,以及如何知道sprintf行执行后发生了什么。 ###

output should be : 0xff 0xd8 0xff 0xe0
but Output I got is : 0 0xd8 0xff 0xe0

2 个答案:

答案 0 :(得分:0)

sprintf(names, "%03d.jpg", count);

将字符串"001.jpg"存储在names中,就像在sprintf之后打印出来一样。由于NUL字符而不是7,因此该字符串需要8个字节来存储,因此您有未定义的行为。在这种特定情况下,NUL写入array[0],恰好与内存中的names相邻。

答案 1 :(得分:0)

您的缓冲区溢出会破坏内存。

字符串"001.jpg"需要8个字符(记住0终结符),但是names数组只有7的空格。第8个字符覆盖array的部分,导致未定义的行为。

将其char names[32]或其他内容。