今月 C の勉強を始めたばかりの者です。
strncpy()
関数について学んでいる時に疑問を抱きました。
strncpy()
関数呼び出し時にコピー先として指定する配列として、コピーする文字数が収まらない要素数を持つ配列を指定した時、コピーが成功するという現象が起こりました。
###対象のプログラム
プログラム1
C
1#include <stdio.h> 2#include <string.h> 3 4int main(void) 5{ 6 char str1[1] = "foobar"; // 文字数的に収まらない文字列で初期化を試みる 7 8 printf("str1 => %s\n", str1); 9 10 return 0; 11} 12
プログラム1のコンパイル結果 (警告内容は理解しています。) :
main15.c: In function ‘main’: main15.c:29:20: warning: initializer-string for array of chars is too long char str1[1] = "foobar";
プログラム2
C
1#include <stdio.h> 2#include <string.h> 3 4int main(void) 5{ 6 char str1[] = "foobar"; // 配列の要素数の指定は省略。6文字の文字列で初期化。 7 char str2[1]; // 配列の要素数として敢えて "foobar" が収まらない数を指定 8 9 strncpy(str2, str1, 6); // "foobar" の全6文字をコピー 10 str2[6] = '\0'; // コピーした最後の文字の次の位置に終端文字を代入 11 12 printf("str1 => %s\n", str1); 13 printf("str2 => %s\n", str2); 14 15 return 0; 16}
プログラム2の実行結果:
str1 => oobar str2 => foobar
実行環境:
Ubuntu 14.04.5 LTS (Cloud9)
gcc version 8.1.0
参考にした書籍:
苦しんで覚えるC言語 - 文字列処理関数
###疑問
- プログラム2の
strncpy()
関数でコピー先として指定している配列の要素数は 1 であるため、 "foobar" が収まらないはずですが、実行時にプログラム1のような警告が出ず、正常にコピーが実行されるのはなぜなのでしょうか。 - プログラム2の
str2[]
宣言時に指定する要素数として、コピーする文字数 + 終端文字
(今回の場合は 7 )未満の数を指定すると、printf("str1 => %s\n", str1);
の結果が "foobar" の一部しか表示されなかったり、何も表示されないという現象が起こりますが、これはなぜなのでしょうか。
なぜコピー元の配列の値が変化することがあるのでしょうか。
他にもこれらの現象を理解する上で知っておくべき概念等がありましたらご教授頂けると幸いです。
よろしくお願い申し上げます。

バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/07/30 22:52