#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
答案 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]
或其他内容。