teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

10

修正

2017/12/09 00:41

投稿

LouiS0616
LouiS0616

スコア35678

answer CHANGED
@@ -46,14 +46,6 @@
46
46
  }
47
47
  ```
48
48
 
49
- ```C
50
- int main(void) {
51
- int val;
52
- hoge(&val); // スコープ的にアウト
53
- return 0;
54
- }
55
- ```
56
-
57
49
  質問の仕方について
58
50
  ---
59
51
  teratailには、コードを見やすく表示する機能があります。

9

修正

2017/12/09 00:41

投稿

LouiS0616
LouiS0616

スコア35678

answer CHANGED
@@ -49,7 +49,7 @@
49
49
  ```C
50
50
  int main(void) {
51
51
  int val;
52
- hoge(&val); // ポインタの『値渡し』なので... スコープ的にアウト
52
+ hoge(&val); // スコープ的にアウト
53
53
  return 0;
54
54
  }
55
55
  ```

8

バグ仕込んでた

2017/12/09 00:40

投稿

LouiS0616
LouiS0616

スコア35678

answer CHANGED
@@ -14,7 +14,7 @@
14
14
  ```C
15
15
  void hoge(int *arg) {
16
16
  int a = 10;
17
- *ptr = a;
17
+ *arg = a;
18
18
  }
19
19
  ```
20
20
 

7

何度も修正してごめん

2017/12/08 16:01

投稿

LouiS0616
LouiS0616

スコア35678

answer CHANGED
@@ -20,8 +20,6 @@
20
20
 
21
21
  **セーフな例**
22
22
  ```C
23
- void hoge(int *);
24
-
25
23
  int main(void) {
26
24
  int val;
27
25
  hoge(&val);

6

コード修正

2017/12/08 16:01

投稿

LouiS0616
LouiS0616

スコア35678

answer CHANGED
@@ -10,18 +10,23 @@
10
10
 
11
11
  三番目の実装例
12
12
  ---
13
+ 次のような関数hogeがあるとします。
14
+ ```C
15
+ void hoge(int *arg) {
16
+ int a = 10;
17
+ *ptr = a;
18
+ }
19
+ ```
20
+
13
21
  **セーフな例**
14
22
  ```C
23
+ void hoge(int *);
24
+
15
25
  int main(void) {
16
26
  int val;
17
27
  hoge(&val);
18
28
  return 0;
19
29
  }
20
-
21
- void hoge(int *arg) {
22
- int a = 10;
23
- *ptr = a;
24
- }
25
30
  ```
26
31
 
27
32
  **アウフな例**
@@ -32,38 +37,23 @@
32
37
  free(ptr); // 忘れるとメモリリーク
33
38
  return 0;
34
39
  }
35
-
36
- void hoge(int *arg) {
37
- int a = 10;
38
- *ptr = a;
39
- }
40
40
  ```
41
41
 
42
42
  **アウトな例**
43
43
  ```C
44
44
  int main(void) {
45
45
  int *ptr;
46
- hoge(ptr);
46
+ hoge(ptr); // 参照先が存在しない
47
47
  return 0;
48
48
  }
49
-
50
- void hoge(int *arg) {
51
- int a = 10;
52
- *ptr = a; // 参照先が存在しない
53
- }
54
49
  ```
55
50
 
56
51
  ```C
57
52
  int main(void) {
58
53
  int val;
59
- hoge(&val);
54
+ hoge(&val); // ポインタの『値渡し』なので... スコープ的にもアウト
60
55
  return 0;
61
56
  }
62
-
63
- void hoge(int *arg) {
64
- int a = 10;
65
- ptr = &a; // ポインタの『値渡し』なので...
66
- }
67
57
  ```
68
58
 
69
59
  質問の仕方について

5

追記

2017/12/08 15:59

投稿

LouiS0616
LouiS0616

スコア35678

answer CHANGED
@@ -66,6 +66,7 @@
66
66
  }
67
67
  ```
68
68
 
69
+ 質問の仕方について
69
70
  ---
70
71
  teratailには、コードを見やすく表示する機能があります。
71
72
  質問編集画面を開き、コードを選択した状態で<code>ボタンを押してください。

4

追記

2017/12/08 15:56

投稿

LouiS0616
LouiS0616

スコア35678

answer CHANGED
@@ -8,7 +8,65 @@
8
8
 
9
9
  三番目が一番素直です。構造体を使うとなお良いです。
10
10
 
11
+ 三番目の実装例
11
12
  ---
13
+ **セーフな例**
14
+ ```C
15
+ int main(void) {
16
+ int val;
17
+ hoge(&val);
18
+ return 0;
19
+ }
20
+
21
+ void hoge(int *arg) {
22
+ int a = 10;
23
+ *ptr = a;
24
+ }
25
+ ```
26
+
27
+ **アウフな例**
28
+ ```C
29
+ int main(void) {
30
+ int *ptr = (int *)malloc(sizeof(int));
31
+ hoge(ptr);
32
+ free(ptr); // 忘れるとメモリリーク
33
+ return 0;
34
+ }
35
+
36
+ void hoge(int *arg) {
37
+ int a = 10;
38
+ *ptr = a;
39
+ }
40
+ ```
41
+
42
+ **アウトな例**
43
+ ```C
44
+ int main(void) {
45
+ int *ptr;
46
+ hoge(ptr);
47
+ return 0;
48
+ }
49
+
50
+ void hoge(int *arg) {
51
+ int a = 10;
52
+ *ptr = a; // 参照先が存在しない
53
+ }
54
+ ```
55
+
56
+ ```C
57
+ int main(void) {
58
+ int val;
59
+ hoge(&val);
60
+ return 0;
61
+ }
62
+
63
+ void hoge(int *arg) {
64
+ int a = 10;
65
+ ptr = &a; // ポインタの『値渡し』なので...
66
+ }
67
+ ```
68
+
69
+ ---
12
70
  teratailには、コードを見やすく表示する機能があります。
13
71
  質問編集画面を開き、コードを選択した状態で<code>ボタンを押してください。
14
72
  ```C

3

謎の『三』が混入したので削除。

2017/12/08 15:52

投稿

LouiS0616
LouiS0616

スコア35678

answer CHANGED
File without changes

2

追記

2017/12/08 15:39

投稿

LouiS0616
LouiS0616

スコア35678

answer CHANGED
@@ -6,6 +6,8 @@
6
6
  - (ポインタ型である)グローバル変数の領域を動的に確保して、それに**数値を**代入するか
7
7
  - 引数にポインタを渡してそこに**数値を**受け取るか
8
8
 
9
+ 三番目が一番素直です。構造体を使うとなお良いです。
10
+
9
11
  ---
10
12
  teratailには、コードを見やすく表示する機能があります。
11
13
  質問編集画面を開き、コードを選択した状態で<code>ボタンを押してください。

1

追記

2017/12/08 15:07

投稿

LouiS0616
LouiS0616

スコア35678

answer CHANGED
@@ -1,6 +1,18 @@
1
1
  ans1, ans2, ans_1, ans_2のスコープはfunc関数内です。
2
2
  ですので、その外部から参照しようとしたときの動作は保証されません。
3
3
 
4
- 次のどちらかで解決できるでしょう。
4
+ 次のいずれかで解決できるでしょう。
5
5
  - (ポインタ型でない)グローバル変数に直に代入するか
6
+ - (ポインタ型である)グローバル変数の領域を動的に確保して、それに**数値を**代入するか
6
- - 引数にポインタを渡してそこに**値のコピーを**受け取るか
7
+ - 引数にポインタを渡してそこに**値を**受け取るか
8
+
9
+ ---
10
+ teratailには、コードを見やすく表示する機能があります。
11
+ 質問編集画面を開き、コードを選択した状態で<code>ボタンを押してください。
12
+ ```C
13
+ #include <stdio.h>
14
+ int main(void) {
15
+ printf("Hello World!\n");
16
+ return 0;
17
+ }
18
+ ```