C:为什么用sprintf修改局部变量



考虑这个例子。我在下面创建了一个本地范围的缓冲区,可以存储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也在堆栈上,所以它会被损坏。

最新更新