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

回答編集履歴

2

修正

2021/02/28 23:27

投稿

thkana
thkana

スコア7739

answer CHANGED
@@ -15,9 +15,9 @@
15
15
  (追記)
16
16
  > lpStringをデバッガで見ると"12345678フフフフフフフフ1234567890"となっています。
17
17
 
18
+ これは別の問題。main側の
18
- これは別の問題。strcpy_s(あるいはstrncpy)の仕様を確認してください。指定数よりコピー元文字列が長かった場合どうなるか、大抵の場合明確に注意がかいてあると思います。
19
+ ` memcpy(cStringDst, cStringSrc, _BUF_SIZE);`
20
+ の動作から導かれるものです。
19
21
 
20
- lpStringを「文字列」として成立させたいのなら、成立するようにプログラム側で打たないといけせまん。
22
+ lpStringを「文字列」として成立させたいのなら、成立するようにmain側のプログラム側で渡す文字列ちゃと作ってやるのでしょう
21
- 簡単には`lpString[_BUF_SIZE-1]='\0';`としておくとか。
23
+ 簡単には`cStringDst[_BUF_SIZE-1]='\0';`としておくとか。
22
-
23
- (そもそもlpStringは関数の外に持ち出せないので何をしたいの? という問題はあるけれど)

1

追記

2021/02/28 23:27

投稿

thkana
thkana

スコア7739

answer CHANGED
@@ -9,4 +9,15 @@
9
9
  なので、渡された配列をなんの制限もなく「文字列である」と信じてアクセスするなら、例えばstrlenでは配列の先頭から'\0'に出会うまで、バイト数を数えながら順次アクセスしようとします。'\0'に出会わなければ延々とアクセスを続けるので、確保されていない領域へのアクセスとなり未定義動作を引き起こす可能性があります。
10
10
 
11
11
  それを防ぐには、lpStringの先頭から_BUF_SIZE文字以内に'\0'があるかどうかを順次調べるとかいうことになるでしょうか。
12
- それでも、呼ぶ側でlpStringに渡す配列のサイズが_BUF_SIZE未満であればやはり未定義動作になりますが、これは呼ばれた側では如何ともし難いので呼び出し側で大丈夫なように担保してもらうしかないです。
12
+ それでも、呼ぶ側でlpStringに渡す配列のサイズが_BUF_SIZE未満であればやはり未定義動作になりますが、これは呼ばれた側では如何ともし難いので呼び出し側で大丈夫なように担保してもらうしかないです。
13
+
14
+ ---
15
+ (追記)
16
+ > lpStringをデバッガで見ると"12345678フフフフフフフフ1234567890"となっています。
17
+
18
+ これは別の問題。strcpy_s(あるいはstrncpy)の仕様を確認してください。指定数よりコピー元文字列が長かった場合どうなるか、大抵の場合明確に注意がかいてあると思います。
19
+
20
+ lpStringを「文字列」として成立させたいのなら、成立するようにプログラム側で手を打たないといけせまん。
21
+ 簡単には`lpString[_BUF_SIZE-1]='\0';`としておくとか。
22
+
23
+ (そもそもlpStringは関数の外に持ち出せないので何をしたいの? という問題はあるけれど)