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

回答編集履歴

2

文言

2021/07/07 07:09

投稿

int32_t
int32_t

スコア21933

answer CHANGED
@@ -1,10 +1,10 @@
1
- **文字列リテラルだけ**を返すのなら、関数 `str` のように単純に`return`して大丈夫です。(返り値の型は `const char*` がいいだろうとか `str` の後に`(void)`が無いとかの問題はありますが)
1
+ 文字列リテラルだけを返すのなら、関数 `str` のように単純に`return`して大丈夫です。(返り値の型は `const char*` がいいだろうとか `str` の後に`(void)`が無いとかの問題はありますが)
2
2
 
3
3
  文字列リテラルではない文字列を返すなら、一般的には `snprintf()` や `strcpy_s()` のように結果を入れるバッファとバッファのサイズを引数として渡します。
4
4
 
5
5
  引数で指定できない場合は、
6
6
  * `strdup()` のように、`malloc()`した領域を返して呼び出し側で `free()` してもらう
7
- * スレッドセーフである必要がないのであれば、グローバルバッファ関数 static なバッファに文字列を格納してそのアドレスを返す。
7
+ * スレッドセーフである必要がないのであれば、大域変数配列や static な局所変数の配列に文字列を格納してそのアドレスを返す。
8
8
 
9
9
  などが考えられます。
10
10
 

1

いろいろ

2021/07/07 07:09

投稿

int32_t
int32_t

スコア21933

answer CHANGED
@@ -1,3 +1,14 @@
1
- 文字列リテラルだけを返すのなら、関数 `str()` のように単純に`return`して大丈夫です。(返り値の型は `const char*` がいいだろうとか `str` の後に`(void)`が無いとかの問題はありますが)
1
+ **文字列リテラルだけ**を返すのなら、関数 `str` のように単純に`return`して大丈夫です。(返り値の型は `const char*` がいいだろうとか `str` の後に`(void)`が無いとかの問題はありますが)
2
2
 
3
+ 文字列リテラルではない文字列を返すなら、一般的には `snprintf()` や `strcpy_s()` のように結果を入れるバッファとバッファのサイズを引数として渡します。
4
+
5
+ 引数で指定できない場合は、
6
+ * `strdup()` のように、`malloc()`した領域を返して呼び出し側で `free()` してもらう
7
+ * スレッドセーフである必要がないのであれば、グローバルのバッファや関数 static なバッファに文字列を格納してそのアドレスを返す。
8
+
9
+ などが考えられます。
10
+
11
+ ----
12
+
13
+
3
14
  クラッシュしているのは、`a[10]` のサイズが足りないからです。文字コードが UTF-8 だとすると、9 * 3 + 1 で28バイトは必要です。