C:为什么用sprintf修改局部变量?
C : why local variable is modifying with sprintf?
考虑这个例子。我在下面创建了一个本地范围的缓冲区,它可以存储 2 个字符和一个终止符。但是当我用 2 位数字(即 a = 20)越过该阈值时,当我调用 sprintf 时会发生一些奇怪的事情。 a 被修改并打印出 0。如果我将 buff 大小从 3 更改为 4。变量 a 不会改变。这是什么令人沮丧的行为?我正在使用 clang 13.0.0 编译器。
int main(int argc, const char * argv[]) {
int a = 20;
{
char buff[3];
sprintf(buff, "a%d", a);
}
printf("value of a %d",a);
return 0;
}
谢谢。
您损坏了缓冲区。所以它会导致未定义的行为。
buff
指向的缓冲区大小只有3个字节。 sprintf(buff, "a%d", a);
向其写入 4 个字节。因为 a
也在堆栈上,所以它被破坏了。
考虑这个例子。我在下面创建了一个本地范围的缓冲区,它可以存储 2 个字符和一个终止符。但是当我用 2 位数字(即 a = 20)越过该阈值时,当我调用 sprintf 时会发生一些奇怪的事情。 a 被修改并打印出 0。如果我将 buff 大小从 3 更改为 4。变量 a 不会改变。这是什么令人沮丧的行为?我正在使用 clang 13.0.0 编译器。
int main(int argc, const char * argv[]) {
int a = 20;
{
char buff[3];
sprintf(buff, "a%d", a);
}
printf("value of a %d",a);
return 0;
}
谢谢。
您损坏了缓冲区。所以它会导致未定义的行为。
buff
指向的缓冲区大小只有3个字节。 sprintf(buff, "a%d", a);
向其写入 4 个字节。因为 a
也在堆栈上,所以它被破坏了。