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 也在堆栈上,所以它被破坏了。