0

私は何が欠けていますか?別の関数でカウンターをインクリメントしたいのに、なぜセグメンテーション違反が発生するのですか?

int point(int *cow);

int main()
{
    int *cow = 0;
    point(cow);
    return(0);

}

int point(int *cow) {
    (*cow)++;
    return(0);
}
4

5 に答える 5

4

nullポインターの逆参照は、Cでは未定義の動作です。

多分あなたは代わりにこれをしたかった:

int a = 0;
int *cow = &a;

point(cow);

一時ポインタcowは不要であり、関数に直接渡すことができることに&a注意してくださいpoint

于 2012-11-22T23:03:14.600 に答える
2

これを行うための良い方法は次のとおりです。

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)++;
}

メインにポインタを置く必要はありません。ポインタをインクリメント関数に渡すだけです。

于 2012-11-22T23:05:53.353 に答える
1

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);
}

幸運を!

于 2012-11-22T23:05:54.257 に答える
1
int *cow = 0;

「牛」を整数へのポインタとして宣言し、そのポインタに値ゼロを割り当てます。次に、それをpoint()に渡し、point()は「0」を逆参照しようとし、そのメモリ位置に格納されている値をインクリメントします。

代わりにこれを試してください:

int x = 0;
int *cow = &x;
point(cow);
于 2012-11-22T23:06:54.600 に答える
0

(wikiからの定義)セグメンテーション違反(多くの場合、segfaultに短縮されます)、バスエラー、またはアクセス違反は、通常、CPUが物理的にアドレス指定できないメモリにアクセスしようとする試みです。

int *cow = 0;

プログラムが上記のメモリにアクセスしようとすると、有効なアドレスではないため、セグメンテーションエラーが発生します。

于 2012-11-22T23:09:08.370 に答える