ストレート 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
文字列リテラルの場合は bss に (基本的には static として) 格納されることを理解していstr
ますが、スタックに割り当てられたバッファーに sprintf(ing) すると、文字列バッファーは純粋にスタックベースになると思いました (したがって、アドレスはスコープブロックを離れた後は意味がありません)?指定されたアドレスのメモリを上書きするには、追加のスタック割り当てが必要になる場合があることは理解していますが、スタック オーバーフローが発生するまで再帰関数を使用しても、 が指す文字列を破損することはできませんでしたstr_ptr
。
参考までに、VS2008 C プロジェクトでテストを行っていますが、GCC は同じ動作を示しているようです。