その呼び出しの前に他のことを行うと、スタック領域には未使用のデータ以外のデータが含まれます。想像してみろ:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int use_stack(void) {
char str[500];
memset(str, 'X', sizeof(str));
printf("Filled memory from %p to %p.\n", &str, &str+sizeof str);
}
void print_stuff() {
int i;
char str[16]; // changed that so that 10..15 contain X
for(i = 0; i < 10; i++) {
str[i] = (char)(i+97);
}
printf("%s<END>",str); // have a line break before <END>? Then it comes from i.
printf("&str: %p\n", &str);
printf("&i: %p\n", &i);
// Here you see that i follows str as &i is &str + 16 (0x10 in hex)
}
int main() {
use_stack();
print_stuff();
}
スタック領域はX
esでいっぱいになり、printf()
それらが表示されます。
あなたの状況とあなたの環境では、スタックはプログラムの開始時に偶然に「クリーン」です。
編集:これは起こるかもしれないし、起こらないかもしれない。コンパイラが変数i
を配列の直後に配置した場合でもNUL
、最初のバイトはの値であるため、データは終了i
します(これも出力されます-あなたの場合はlibneブレークである可能性があります-そして2番目のバイトはNUL
バイトです。これが当てはまる場合でも、コードはUB(未定義の動作)を呼び出します。
出力に文字hexdump
が含まれているかどうかを(プログラム出力をパイプでつなぐなどして)確認できますか?0A
もしそうなら、私の推測は正しいです。私はちょうどそれをテストしました、私のコンパイラ(gcc
)でそれは方法のようです。
言ったように、あなたが頼るべきものは何もありません。
EDIT2:前に改行が表示された場合<END>
、私の推測は正しかった。そして、現在印刷されているポインタを見ると、メモリ内のそれらのアドレスを比較できます。