私は何が欠けていますか?別の関数でカウンターをインクリメントしたいのに、なぜセグメンテーション違反が発生するのですか?
int point(int *cow);
int main()
{
int *cow = 0;
point(cow);
return(0);
}
int point(int *cow) {
(*cow)++;
return(0);
}
私は何が欠けていますか?別の関数でカウンターをインクリメントしたいのに、なぜセグメンテーション違反が発生するのですか?
int point(int *cow);
int main()
{
int *cow = 0;
point(cow);
return(0);
}
int point(int *cow) {
(*cow)++;
return(0);
}
nullポインターの逆参照は、Cでは未定義の動作です。
多分あなたは代わりにこれをしたかった:
int a = 0;
int *cow = &a;
point(cow);
一時ポインタcow
は不要であり、関数に直接渡すことができることに&a
注意してくださいpoint
。
これを行うための良い方法は次のとおりです。
void point (int *cow);
int main () {
int cow = 0; // Create a simple int, not a pointer
point (&cow); // Pass address (&) of your int
return 0;
}
void point (int *cow) {
(*cow)++;
}
メインにポインタを置く必要はありません。ポインタをインクリメント関数に渡すだけです。
nullポインタを逆参照しようとしていますが、これは確かにプログラムをクラッシュさせます。あなたはおそらくこれをするつもりでした:
int point(int *cow);
int main()
{
int cow = 0;
point(&cow);
return(0);
}
int point(int *cow) {
(*cow)++;
return(0);
}
元のコードでは、intへのポインター(つまり、int * cow)を作成しましたが、インクリメントしようとしている値を格納するintを実際に作成したことはありません。以下は、上記のコード変更と元のコードを組み合わせた有効な例でもあります。
int point(int *cow);
int main()
{
int cow = 0;
int* pCow = &cow;
point(pCow);
return(0);
}
int point(int *cow) {
(*cow)++;
return(0);
}
幸運を!
int *cow = 0;
「牛」を整数へのポインタとして宣言し、そのポインタに値ゼロを割り当てます。次に、それをpoint()に渡し、point()は「0」を逆参照しようとし、そのメモリ位置に格納されている値をインクリメントします。
代わりにこれを試してください:
int x = 0;
int *cow = &x;
point(cow);
(wikiからの定義)セグメンテーション違反(多くの場合、segfaultに短縮されます)、バスエラー、またはアクセス違反は、通常、CPUが物理的にアドレス指定できないメモリにアクセスしようとする試みです。
int *cow = 0;
プログラムが上記のメモリにアクセスしようとすると、有効なアドレスではないため、セグメンテーションエラーが発生します。