回答編集履歴

3 operator

yumetodo

yumetodo score 4500

2017/07/23 15:54  投稿

**`x`がどこを指しているか**が問題です。
正回答では、格納する場所を作り、それを指すポインタを`scanf`に渡しました。
```c
int x;//格納する場所
int* x_p = &x;//格納する場所を指すポインタ
scanf("%d", x_p);
```
ここで上例で`x_p`のみの状態が誤回答の状態です。どこを指しているか不明なポインタを渡しています。
# 追記
> ポインタはあらかじめ格納する場所を用意しておく必要があるということですか?
じゃないと何を指し示すのか(point)わからないじゃないですか。
ちなみにどこを指しているかわからない or NULL pointerはdereferenceしてはいけません。
ちなみにどこを指しているかわからない or NULL pointerはdereferenceしてはいけません。dereferenceとは具体的に言うと、`operator *`(単項演算子), `operator []`の呼び出しです。
```c
int x;
int* p1 = &x;
int* p2;
int* p3 = NULL;
int* p4 = malloc(sizof(int));
*p1;//OK
//*p2;//NG: Undefined Behavior: C11, 6.5.3.2p4
//*p3;//NG: Undefined Behavior: C11, 6.5.3.2p4
*p4;//OK
free(p4);
```
ref:
- [c++ - Is dereferencing a pointer that's equal to nullptr undefined behavior by the standard? - Stack Overflow](https://stackoverflow.com/questions/28573215/is-dereferencing-a-pointer-thats-equal-to-nullptr-undefined-behavior-by-the-sta)
2 UB

yumetodo

yumetodo score 4500

2017/07/23 14:37  投稿

**`x`がどこを指しているか**が問題です。
正回答では、格納する場所を作り、それを指すポインタを`scanf`に渡しました。
```c
int x;//格納する場所
int* x_p = &x;//格納する場所を指すポインタ
scanf("%d", x_p);
```
ここで上例で`x_p`のみの状態が誤回答の状態です。どこを指しているか不明なポインタを渡しています。
# 追記
> ポインタはあらかじめ格納する場所を用意しておく必要があるということですか?
じゃないと何を指し示すのか(point)わからないじゃないですか。
ちなみにどこを指しているかわからない or NULL pointerはdereferenceしてはいけません。
```c
int x;
int* p1 = &x;
int* p2;
int* p3 = NULL;
int* p4 = malloc(sizof(int));
*p1;//OK
//*p2;//NG
//*p3;//NG
//*p2;//NG: Undefined Behavior: C11, 6.5.3.2p4
//*p3;//NG: Undefined Behavior: C11, 6.5.3.2p4
*p4;//OK
free(p4);
```
```
ref:
- [c++ - Is dereferencing a pointer that's equal to nullptr undefined behavior by the standard? - Stack Overflow](https://stackoverflow.com/questions/28573215/is-dereferencing-a-pointer-thats-equal-to-nullptr-undefined-behavior-by-the-sta)
1 追記

yumetodo

yumetodo score 4500

2017/07/23 14:30  投稿

**`x`がどこを指しているか**が問題です。
正回答では、格納する場所を作り、それを指すポインタを`scanf`に渡しました。
```cpp
```c
int x;//格納する場所
int* x_p = &x;//格納する場所を指すポインタ
scanf("%d", x_p);
```
ここで上例で`x_p`のみの状態が誤回答の状態です。どこを指しているか不明なポインタを渡しています。
ここで上例で`x_p`のみの状態が誤回答の状態です。どこを指しているか不明なポインタを渡しています。
# 追記
> ポインタはあらかじめ格納する場所を用意しておく必要があるということですか?
じゃないと何を指し示すのか(point)わからないじゃないですか。
ちなみにどこを指しているかわからない or NULL pointerはdereferenceしてはいけません。
```c
int x;
int* p1 = &x;
int* p2;
int* p3 = NULL;
int* p4 = malloc(sizof(int));
*p1;//OK
//*p2;//NG
//*p3;//NG
*p4;//OK
free(p4);
```

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る