0

次のコードは ideone では問題なく動作しますが、codeblocks IDE で実行時エラーが発生します。IDE が壊れていますか、それともプログラミング言語固有の問題がありますか?

#include<stdio.h>

int main(){
    int *pointer;
    int num = 45;
    *pointer = num;
    printf("pointer points to value %d", *pointer);
    return 0;
}
4

4 に答える 4

8

これを交換

*pointer = num;

pointer = &num;

ポインターは、値を割り当てる前にメモリ空間を指す必要があります。

この方法でポインターを定義すると、次のようになります。

int *pointer;

これは、ポインターを定義したことを意味しますが、ポインターはまだメモリ空間を指していません。また、ポインターをメモリ空間を指すことなく直接使用すると (コードで行ったように)、未定義の動作が発生します。

ポインタをメモリ空間に向けるには、次のいずれかの方法を使用できます。

1) 静的メモリを指す

int num;
int *pointer = &num;

num は、静的として定義された int です。したがって、ポインタは num メモリを指すことができます

2) 動的メモリを指す

int *pointer = malloc(sizeof(int));

ポインタは動的メモリを指している可能性があります。動的メモリを割り当てることができmalloc()、メモリが役に立たなくなったときにメモリを解放できますfree(pointer)

于 2013-02-04T12:50:26.450 に答える
1

まず、「int *pointer」でポインタを定義しました。

次に、「*pointer = num」を使用して間接アクセスを実現しようとします—ポインター「pointer」が指すメモリ空間にnumの値を割り当てます。

よし、ここで問題だ!コードから、ポインターを定義しただけで、メモリ空間を指していません。それをせずに間接的なアクセスを行うことは非常に危険です。したがって、実行時エラーが表示されます。

ここで、「int value;pointer = &value;」を追加する必要があります。あなたのコードに。ポインター「ポインター」が「値」を指すようにします。また、間接アクセス "*pointer = num" を介して "num" を "value" に割り当てることができます。

私の意見では、ポインターを学習するときは、定義と間接アクセスを区別する必要があります。

私は英語が苦手な人です。これは、スタック オーバーフローに関する私の最初の回答です。私の答えがお役に立てば幸いです。ありがとうございました。

于 2013-02-04T14:43:01.147 に答える
1

ポインターは値ではなくアドレスを保持することになっているため、num のアドレスをポインターに割り当てます。ポインターの詳細については、こちらをご覧ください

pointer = &num;

ポインターを介して変数の値を変更する

*pointer = 11;
于 2013-02-04T12:50:48.767 に答える
-1

まず、ポイントしようとしているポインタを初期化してから、それを使用してポイントされた値を変更する必要があります.. as ...

pointer=&num;

ポインターを使用して、ポインターが指している値を変更またはアクセスします。

于 2013-02-04T12:53:35.140 に答える