C言語ポインタオフサイドアクセス例
869 ワード
C言語は配列の下付き文字を検査せず、ポインタはしばしば境界を越えてアクセスする.私たちはプログラミングに特に注意しなければならない.
一、模範コード
上記の例では、コンパイルリンクは通過するが、プログラム実行結果b[0]=10;
出力a[10]およびb[0]アドレス:
結果:
a[10]アドレス0 x 41454 c
b[0]アドレスは 0x41454c
備考:上記のプログラムはvc 6.0でコンパイルされ、異なるコンパイルシステムのアドレス値が異なる可能性がある.ただし、a[10]およびb[0]のアドレス値は常に同じである.
二、解釈
連続的に定義されたグローバル変数はメモリに連続的に格納され、同時にCは配列の下付きを検査しない.ポインタがメモリに境界を越えてアクセスすると、コンパイラはエラーをプロンプトしません.境界を越えたポインタでメモリを読み書きし、軽いとプログラムの結果が間違って、重いと直接プログラムがクラッシュします.
一、模範コード
#include
#include
int a[10];
int b[10];
void main()
{
memset(a,0,sizeof(int)*10);
memset(b,0,sizeof(int)*10);
a[10]=10;
cout<
上記の例では、コンパイルリンクは通過するが、プログラム実行結果b[0]=10;
出力a[10]およびb[0]アドレス:
#include
#include
int a[10];
int b[10];
void main()
{
cout<
結果:
a[10]アドレス0 x 41454 c
b[0]アドレスは 0x41454c
備考:上記のプログラムはvc 6.0でコンパイルされ、異なるコンパイルシステムのアドレス値が異なる可能性がある.ただし、a[10]およびb[0]のアドレス値は常に同じである.
二、解釈
連続的に定義されたグローバル変数はメモリに連続的に格納され、同時にCは配列の下付きを検査しない.ポインタがメモリに境界を越えてアクセスすると、コンパイラはエラーをプロンプトしません.境界を越えたポインタでメモリを読み書きし、軽いとプログラムの結果が間違って、重いと直接プログラムがクラッシュします.