質問編集履歴

1

reallocをしている箇所をただしくmallocでメモリ確保しました。

2017/07/27 13:51

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -121,3 +121,141 @@
121
121
  ふと疑問に思ったのですが、(1)の第一引数のポインタが指し示すヌル文字に第二引数の最初の文字を代入していきますが、Javaやpythonなどの文字列はイミュータブルだと聞いたのですが
122
122
 
123
123
  C言語では上記のように任意の文字列リテラルの任意の位置の文字を差し替えるなどしても問題ないのでしょうか?
124
+
125
+
126
+
127
+ AtsushiSaitoさんから
128
+
129
+ mallocしていないポインタをreallocすることは不適切だとの指摘を受けたので
130
+
131
+ 修正してみました。
132
+
133
+
134
+
135
+
136
+
137
+ ```C
138
+
139
+ #include <stdio.h>
140
+
141
+ #include <stdlib.h>
142
+
143
+ #include <string.h>
144
+
145
+
146
+
147
+ int main (int count, char* param[]) {
148
+
149
+
150
+
151
+ char* str_a = NULL;
152
+
153
+ char* str_b = NULL;
154
+
155
+ char* my_strconcat(char* a, char* b);
156
+
157
+ if (count > 2) {
158
+
159
+ str_a = param[1];
160
+
161
+ str_b = param[2];
162
+
163
+ } else {
164
+
165
+ printf("It is not enough that parameter which you proposed.");
166
+
167
+ exit(2);
168
+
169
+ }
170
+
171
+ char* res = NULL;
172
+
173
+ res = my_strconcat(str_a, str_b);
174
+
175
+ printf("%s", res);
176
+
177
+ return(0);
178
+
179
+ }
180
+
181
+
182
+
183
+ char* my_strconcat(char* a, char* b) {
184
+
185
+ char* temp = NULL;
186
+
187
+ char* source_p = NULL;
188
+
189
+ int len_a = 0;
190
+
191
+ int len_b = 0;
192
+
193
+ len_a = strlen(a);
194
+
195
+ len_b = strlen(b);
196
+
197
+ temp = malloc(len_a + len_b);
198
+
199
+ // temp = realloc(a, len_a + len_b);
200
+
201
+ if (temp != NULL) {
202
+
203
+ source_p = temp;
204
+
205
+ } else {
206
+
207
+ printf("The application failed the command.");
208
+
209
+ exit(2);
210
+
211
+ }
212
+
213
+
214
+
215
+ int i = 0;
216
+
217
+ while(1) {
218
+
219
+ if (*a != '\0') {
220
+
221
+ *temp = *a;
222
+
223
+ temp++;
224
+
225
+ a++;
226
+
227
+ } else if (*a == '\0') {
228
+
229
+ if (*(b) != '\0') {
230
+
231
+ *temp = *(b);
232
+
233
+ temp++;
234
+
235
+ b++;
236
+
237
+ } else {
238
+
239
+ break;
240
+
241
+ }
242
+
243
+ }
244
+
245
+ }
246
+
247
+ *temp = '\0';
248
+
249
+ return (source_p);
250
+
251
+ }
252
+
253
+ ```
254
+
255
+
256
+
257
+ reallocをmallocに変えて 引数に渡った2つの文字列を一バイトずつ
258
+
259
+ コピーしました。
260
+
261
+ ちょっとというかかなり冗長になってますが,Cのポインタ操作としては問題ないでしょうか?