回答編集履歴

10

修正

2017/12/09 00:41

投稿

LouiS0616
LouiS0616

スコア35658

test CHANGED
@@ -94,22 +94,6 @@
94
94
 
95
95
 
96
96
 
97
- ```C
98
-
99
- int main(void) {
100
-
101
- int val;
102
-
103
- hoge(&val); // スコープ的にアウト
104
-
105
- return 0;
106
-
107
- }
108
-
109
- ```
110
-
111
-
112
-
113
97
  質問の仕方について
114
98
 
115
99
  ---

9

修正

2017/12/09 00:41

投稿

LouiS0616
LouiS0616

スコア35658

test CHANGED
@@ -100,7 +100,7 @@
100
100
 
101
101
  int val;
102
102
 
103
- hoge(&val); // ポインタの『値渡し』なので... スコープ的にアウト
103
+ hoge(&val); // スコープ的にアウト
104
104
 
105
105
  return 0;
106
106
 

8

バグ仕込んでた

2017/12/09 00:40

投稿

LouiS0616
LouiS0616

スコア35658

test CHANGED
@@ -30,7 +30,7 @@
30
30
 
31
31
  int a = 10;
32
32
 
33
- *ptr = a;
33
+ *arg = a;
34
34
 
35
35
  }
36
36
 

7

何度も修正してごめん

2017/12/08 16:01

投稿

LouiS0616
LouiS0616

スコア35658

test CHANGED
@@ -41,10 +41,6 @@
41
41
  **セーフな例**
42
42
 
43
43
  ```C
44
-
45
- void hoge(int *);
46
-
47
-
48
44
 
49
45
  int main(void) {
50
46
 

6

コード修正

2017/12/08 16:01

投稿

LouiS0616
LouiS0616

スコア35658

test CHANGED
@@ -22,9 +22,29 @@
22
22
 
23
23
  ---
24
24
 
25
+ 次のような関数hogeがあるとします。
26
+
27
+ ```C
28
+
29
+ void hoge(int *arg) {
30
+
31
+ int a = 10;
32
+
33
+ *ptr = a;
34
+
35
+ }
36
+
37
+ ```
38
+
39
+
40
+
25
41
  **セーフな例**
26
42
 
27
43
  ```C
44
+
45
+ void hoge(int *);
46
+
47
+
28
48
 
29
49
  int main(void) {
30
50
 
@@ -33,16 +53,6 @@
33
53
  hoge(&val);
34
54
 
35
55
  return 0;
36
-
37
- }
38
-
39
-
40
-
41
- void hoge(int *arg) {
42
-
43
- int a = 10;
44
-
45
- *ptr = a;
46
56
 
47
57
  }
48
58
 
@@ -66,16 +76,6 @@
66
76
 
67
77
  }
68
78
 
69
-
70
-
71
- void hoge(int *arg) {
72
-
73
- int a = 10;
74
-
75
- *ptr = a;
76
-
77
- }
78
-
79
79
  ```
80
80
 
81
81
 
@@ -88,19 +88,9 @@
88
88
 
89
89
  int *ptr;
90
90
 
91
- hoge(ptr);
91
+ hoge(ptr); // 参照先が存在しない
92
92
 
93
93
  return 0;
94
-
95
- }
96
-
97
-
98
-
99
- void hoge(int *arg) {
100
-
101
- int a = 10;
102
-
103
- *ptr = a; // 参照先が存在しない
104
94
 
105
95
  }
106
96
 
@@ -114,19 +104,9 @@
114
104
 
115
105
  int val;
116
106
 
117
- hoge(&val);
107
+ hoge(&val); // ポインタの『値渡し』なので... スコープ的にもアウト
118
108
 
119
109
  return 0;
120
-
121
- }
122
-
123
-
124
-
125
- void hoge(int *arg) {
126
-
127
- int a = 10;
128
-
129
- ptr = &a; // ポインタの『値渡し』なので...
130
110
 
131
111
  }
132
112
 

5

追記

2017/12/08 15:59

投稿

LouiS0616
LouiS0616

スコア35658

test CHANGED
@@ -134,6 +134,8 @@
134
134
 
135
135
 
136
136
 
137
+ 質問の仕方について
138
+
137
139
  ---
138
140
 
139
141
  teratailには、コードを見やすく表示する機能があります。

4

追記

2017/12/08 15:56

投稿

LouiS0616
LouiS0616

スコア35658

test CHANGED
@@ -15,6 +15,122 @@
15
15
 
16
16
 
17
17
  三番目が一番素直です。構造体を使うとなお良いです。
18
+
19
+
20
+
21
+ 三番目の実装例
22
+
23
+ ---
24
+
25
+ **セーフな例**
26
+
27
+ ```C
28
+
29
+ int main(void) {
30
+
31
+ int val;
32
+
33
+ hoge(&val);
34
+
35
+ return 0;
36
+
37
+ }
38
+
39
+
40
+
41
+ void hoge(int *arg) {
42
+
43
+ int a = 10;
44
+
45
+ *ptr = a;
46
+
47
+ }
48
+
49
+ ```
50
+
51
+
52
+
53
+ **アウフな例**
54
+
55
+ ```C
56
+
57
+ int main(void) {
58
+
59
+ int *ptr = (int *)malloc(sizeof(int));
60
+
61
+ hoge(ptr);
62
+
63
+ free(ptr); // 忘れるとメモリリーク
64
+
65
+ return 0;
66
+
67
+ }
68
+
69
+
70
+
71
+ void hoge(int *arg) {
72
+
73
+ int a = 10;
74
+
75
+ *ptr = a;
76
+
77
+ }
78
+
79
+ ```
80
+
81
+
82
+
83
+ **アウトな例**
84
+
85
+ ```C
86
+
87
+ int main(void) {
88
+
89
+ int *ptr;
90
+
91
+ hoge(ptr);
92
+
93
+ return 0;
94
+
95
+ }
96
+
97
+
98
+
99
+ void hoge(int *arg) {
100
+
101
+ int a = 10;
102
+
103
+ *ptr = a; // 参照先が存在しない
104
+
105
+ }
106
+
107
+ ```
108
+
109
+
110
+
111
+ ```C
112
+
113
+ int main(void) {
114
+
115
+ int val;
116
+
117
+ hoge(&val);
118
+
119
+ return 0;
120
+
121
+ }
122
+
123
+
124
+
125
+ void hoge(int *arg) {
126
+
127
+ int a = 10;
128
+
129
+ ptr = &a; // ポインタの『値渡し』なので...
130
+
131
+ }
132
+
133
+ ```
18
134
 
19
135
 
20
136
 

3

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

2017/12/08 15:52

投稿

LouiS0616
LouiS0616

スコア35658

test CHANGED
File without changes

2

追記

2017/12/08 15:39

投稿

LouiS0616
LouiS0616

スコア35658

test CHANGED
@@ -11,6 +11,10 @@
11
11
  - (ポインタ型である)グローバル変数の領域を動的に確保して、それに**数値を**代入するか
12
12
 
13
13
  - 引数にポインタを渡してそこに**数値を**受け取るか
14
+
15
+
16
+
17
+ 三番目が一番素直です。構造体を使うとなお良いです。
14
18
 
15
19
 
16
20
 

1

追記

2017/12/08 15:07

投稿

LouiS0616
LouiS0616

スコア35658

test CHANGED
@@ -4,8 +4,32 @@
4
4
 
5
5
 
6
6
 
7
- 次のどちらかで解決できるでしょう。
7
+ 次のいずれかで解決できるでしょう。
8
8
 
9
9
  - (ポインタ型でない)グローバル変数に直に代入するか
10
10
 
11
+ - (ポインタ型である)グローバル変数の領域を動的に確保して、それに**数値を**代入するか
12
+
11
- - 引数にポインタを渡してそこに**値のコピーを**受け取るか
13
+ - 引数にポインタを渡してそこに**値を**受け取るか
14
+
15
+
16
+
17
+ ---
18
+
19
+ teratailには、コードを見やすく表示する機能があります。
20
+
21
+ 質問編集画面を開き、コードを選択した状態で<code>ボタンを押してください。
22
+
23
+ ```C
24
+
25
+ #include <stdio.h>
26
+
27
+ int main(void) {
28
+
29
+ printf("Hello World!\n");
30
+
31
+ return 0;
32
+
33
+ }
34
+
35
+ ```