Для прямых C и GCC, почему строка с целлой не повреждена здесь?C Stack-Allocated String Scope
#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
| -------------------- |
Код a link приведен в код, скомпилированный и выполненный с использованием онлайн-компилятора.
Я понимаю, что если str
был строковым литералом, str
был бы сохранен в bss (по существу, как статический), но sprintf (ing) в буфер, распределенный по стекам, я думал, что строковый буфер будет чисто стек- (и, следовательно, адрес не имеет смысла после выхода из блока видимости)? Я понимаю, что для избыточной записи памяти по указанному адресу может потребоваться дополнительное распределение стека, но даже с использованием рекурсивной функции до тех пор, пока не произойдет переполнение стека, я не смог повредить строку, на которую указывает str_ptr
.
FYI Я делаю свое тестирование в VS2008 C проекте, хотя GCC, похоже, демонстрирует такое же поведение.
Этот код не является C90. –