对于直接的 C 和 GCC,为什么指向的字符串在这里没有损坏?
#include <stdio.h>
int main(int argc, char *argv[])
{
char* str_ptr = NULL;
{
//local to this scope-block
char str[4]={0};
sprintf(str, "AGH");
str_ptr = str;
}
printf("str_ptr: %s\n", str_ptr);
getchar();
return 0;
}
|----输出-----|
str_ptr: AGH
|--------------------|
这是使用在线编译器编译和执行的上述代码的链接。
我知道如果str
是字符串文字,str
将存储在 bss 中(本质上作为静态),但 sprintf(ing) 到堆栈分配的缓冲区,我认为字符串缓冲区将纯粹基于堆栈(因此地址离开范围块后没有意义)?我知道可能需要额外的堆栈分配来覆盖给定地址的内存,但即使在发生堆栈溢出之前使用递归函数,我也无法破坏str_ptr
.
仅供参考,我正在 VS2008 C 项目中进行测试,尽管 GCC 似乎表现出相同的行为。