シングルチップマシンのメモリオーバーフローを引き起こしやすいいくつかのトラップ
【要旨】プログラム変数とメモリの割り当てについては、常に注目しなければならない問題です.多くの人が多くのミスを犯していると信じています.私たちの基礎がしっかりしていないことや、プログラムを書く習慣が足りないことを示している可能性があります.プログラムの変数とメモリに関する概念をまとめると、C言語に属する非常に基礎的な知識ですが、仕事は中1では、メモリの漏洩やメモリのオーバーフローなどの問題が発生します.だから自分の理解もまだまだ足りない.ここでこの方面についての知識点をまとめて、お互いに勉強して、もっと自分に注意して、そして自分の経験としてまとめます
プログラムの変数やメモリに関する概念をまとめると、C言語に関する非常に基礎的な知識ですが、仕事中にうっかりメモリ漏れやメモリオーバーフローなどの問題が発生してしまいます.だから自分の理解もまだまだ足りない.ここでこの方面についての知識点をまとめて、お互いに勉強して、もっと自分に注意して、そして自分の経験としてまとめます.
私たちのプログラムは一般的にflashに格納されていることを知っていますが、実行時にはメモリ(RAM)で実行されています.私たちのプログラムは一般的にマクロ定義、変数、定数、ダイナミックエリア、プログラムコードのいくつかの部分から構成されています.
次のDemoプログラムでは、プログラムが実行されているときに、これらの部分がメモリのどこにあるかを理解します.
アクセス境界:
Demoプログラム上のstrcap()文は、前のstr変数が申請した空間メモリサイズよりも後ろの文字列サイズが大きい場合にアクセス限界が発生します.プログラムを書くときは特にその文字列がどれだけ長いかに注目し、注意しなければなりません.境界を越えたアクセスの問題が発生した場合、コンパイラでは認識できない場合がありますが、このメモリアクセスエラーが発生することは確かです.sprintf()、strcat()などの関数が境界を越えたアクセスを引き起こす可能性があります.
また配列では,配列も特にアクセス境界を越えやすく,配列長が配列下のスケール長を超えているかどうかを検出するコンパイラもあるかもしれないが,配列をfor()サイクルでアクセスする場合,このときはアクセス境界を越えないように注意する必要がある.コンパイルでは検出できませんが、実行中にメモリアクセスの障害が発生します.
スタック:
上のDemoプログラムによると、ローカル変数は「スタック領域」に存在することが知られているので、一般的に私たちのローカル変数はあまり定義されていません.特にいくつかの配列変数は、非常に大きいと、非常に大きなスタック領域の空間を占有し、プログラムが実行されている間にスタックオーバーフローが発生しやすいです.通常、私たちのプログラムでは避けられない関数が呼び出されるので、関数を呼び出すときは、関数を呼び出す過程でスタック領域に関数に関連する変数やアドレスが絶えず格納されるため、深い呼び出しはしないほうがいいです.したがって,深いレベルの関数再帰呼び出しが必要な場合は,できるだけ別の方法で代用する.
ヒープ領域:
ダイナミックエリアを申請すると、使い終わったときは必ず解放(free)を覚えておいてください.解放されていないと、このメモリ領域は使用できない状態になります(茅の穴を占めて糞をしないように)、プログラムが大きくなったり、長く実行したりすると、メモリの漏洩を招く可能性があります.(再起動すると90%の問題の根源が解決される)と同時に、解放時にも解放されるメモリは一度しか解放されないことに注意し、繰り返し解放しないでください.コード量が大きい場合もあるので、コードの解放操作を複数の場所で行っている可能性があります.メモリが1回解放されると、そのメモリ領域が別のことに使われる可能性がありますああ、もしこの時にもう一度釈放すれば、問題が発生する可能性が高い.リリースが完了したら、次にポインタを使用するときにアドレスのエラーが発生しないように、ポインタを空のアドレスに向けたほうがいいです.
以上は私たちが普段開発している過程で特に注意しなければならないことです.このような概念があってからコードを書くか、コードを計画するときに、心の中に数があることができます.私たちはこれらのものがメモリのどこにあるかを知っています.そうすれば、メモリのオーバーフローや漏洩の問題をできるだけ避けることができます.私たちのコードの効率を高めることもできます.
プログラム変数やメモリ割り当てなど、常に注目すべき問題です.私は多くの人がこの中で多くの間違いを犯したことがあると信じています.私たちの基礎がしっかりしていないことを説明しているかもしれません.プログラムを書く習慣もよくありません.(しかし、メモリ漏れに耐えられない人もいるかもしれませんが、「自動ゴミ回収メカニズムgc」を開発してJavaができました
作者:Micah
プログラムの変数やメモリに関する概念をまとめると、C言語に関する非常に基礎的な知識ですが、仕事中にうっかりメモリ漏れやメモリオーバーフローなどの問題が発生してしまいます.だから自分の理解もまだまだ足りない.ここでこの方面についての知識点をまとめて、お互いに勉強して、もっと自分に注意して、そして自分の経験としてまとめます.
私たちのプログラムは一般的にflashに格納されていることを知っていますが、実行時にはメモリ(RAM)で実行されています.私たちのプログラムは一般的にマクロ定義、変数、定数、ダイナミックエリア、プログラムコードのいくつかの部分から構成されています.
次のDemoプログラムでは、プログラムが実行されているときに、これらの部分がメモリのどこにあるかを理解します.
#define OFF 0x00 // , , .
float Num = 3.14; // , “ ”
char* str = NULL; // , “ ”
int main()
{
int time; // , “ ”
char* path = "C:\\Users"; // , “ ”
int Users_Num[8]; // , “ ”
srt = (char*)malloc(10); // , “ ”
static flaot con = 1.0; // , “ ”
//
delay_ms(time); //time ,
strcap(str,"Hello World"); // “hello World” str ,
free(str); // str
str = NULL; // str ,
}
アクセス境界:
Demoプログラム上のstrcap()文は、前のstr変数が申請した空間メモリサイズよりも後ろの文字列サイズが大きい場合にアクセス限界が発生します.プログラムを書くときは特にその文字列がどれだけ長いかに注目し、注意しなければなりません.境界を越えたアクセスの問題が発生した場合、コンパイラでは認識できない場合がありますが、このメモリアクセスエラーが発生することは確かです.sprintf()、strcat()などの関数が境界を越えたアクセスを引き起こす可能性があります.
また配列では,配列も特にアクセス境界を越えやすく,配列長が配列下のスケール長を超えているかどうかを検出するコンパイラもあるかもしれないが,配列をfor()サイクルでアクセスする場合,このときはアクセス境界を越えないように注意する必要がある.コンパイルでは検出できませんが、実行中にメモリアクセスの障害が発生します.
スタック:
上のDemoプログラムによると、ローカル変数は「スタック領域」に存在することが知られているので、一般的に私たちのローカル変数はあまり定義されていません.特にいくつかの配列変数は、非常に大きいと、非常に大きなスタック領域の空間を占有し、プログラムが実行されている間にスタックオーバーフローが発生しやすいです.通常、私たちのプログラムでは避けられない関数が呼び出されるので、関数を呼び出すときは、関数を呼び出す過程でスタック領域に関数に関連する変数やアドレスが絶えず格納されるため、深い呼び出しはしないほうがいいです.したがって,深いレベルの関数再帰呼び出しが必要な場合は,できるだけ別の方法で代用する.
ヒープ領域:
ダイナミックエリアを申請すると、使い終わったときは必ず解放(free)を覚えておいてください.解放されていないと、このメモリ領域は使用できない状態になります(茅の穴を占めて糞をしないように)、プログラムが大きくなったり、長く実行したりすると、メモリの漏洩を招く可能性があります.(再起動すると90%の問題の根源が解決される)と同時に、解放時にも解放されるメモリは一度しか解放されないことに注意し、繰り返し解放しないでください.コード量が大きい場合もあるので、コードの解放操作を複数の場所で行っている可能性があります.メモリが1回解放されると、そのメモリ領域が別のことに使われる可能性がありますああ、もしこの時にもう一度釈放すれば、問題が発生する可能性が高い.リリースが完了したら、次にポインタを使用するときにアドレスのエラーが発生しないように、ポインタを空のアドレスに向けたほうがいいです.
以上は私たちが普段開発している過程で特に注意しなければならないことです.このような概念があってからコードを書くか、コードを計画するときに、心の中に数があることができます.私たちはこれらのものがメモリのどこにあるかを知っています.そうすれば、メモリのオーバーフローや漏洩の問題をできるだけ避けることができます.私たちのコードの効率を高めることもできます.
プログラム変数やメモリ割り当てなど、常に注目すべき問題です.私は多くの人がこの中で多くの間違いを犯したことがあると信じています.私たちの基礎がしっかりしていないことを説明しているかもしれません.プログラムを書く習慣もよくありません.(しかし、メモリ漏れに耐えられない人もいるかもしれませんが、「自動ゴミ回収メカニズムgc」を開発してJavaができました
作者:Micah