2017-01-04 13 views
0

配列変数a [] = "abc"を設定し、別の配列変数b [] = {'d'、 'e'、 'f'}を設定すると、私の最後の出力コードはprintf ( "%s"、b)、出力値は "defabc"です、なぜですか?私の出力は配列bですが、出力値は最初に配列bを出力し、次に出力配列を1秒出力します。 全体のコードは以下の通りです。配列出力

#include<stdio.h> 
void main(){ 
    char a[]="abc"; 
    char b[]={'d','e','f'}; 
    printf("%s",b); 
} 

出力は「defabc」です。 配列bの文字列長は7ですなぜですか?

+0

としてdefを印刷します。 –

+1

あなたはbにヌルターミネーターを持っていないので、関数は過去のバッファを読み込み、スタック上の次の行は –

+1

@AdityaKです。プログラマが何か間違っていると、_undefined_の動作の喜びです。 ;) –

答えて

0

両方の文字列の最後にヌルターミネータが必要です。 2番目の文字列には、文字配列として定義されている文字列はありません。

+0

あなたの助けにはOKです。 – Pulsar

3

Cでは、すべての文字列がnullでなければなりません(すなわち\0)が終了するので、2番目の変数は、次のようになります。"defabc"はあなたのコードが印刷されている理由

char b[] = {'d', 'e', 'f', '\0'}; 

あなたは好奇心かもしれません。答えは、すべてのローカル変数はstack-based memory layoutに格納されています。だからあなたのメモリレイアウトは次のようになります。

|'d' | <-- b 
|'e' | 
|'f' | 
|'a' | <-- a 
|'b' | 
|'c' | 
|'\0'| 

printf("%s", ...)はそれが\0に到達するまで読み込むので、期待通りprintf("%s", a)作品が、printf("%s", b)プリント"defabc"ことに注意してください。文字列を宣言するために

+0

ああ、私は理解しています。 – Pulsar

+0

私はスタックデータ構造について言及しませんが、[メモリ構成](https://en.m.wikipedia.org/wiki/Stack-based_memory_allocation)です。データ構造はここでは関係ありません –

+0

@OlegBogdanovあなたは正しい "データ構造"は異なる目的のためです! –

0

正しい方法は

char b[] = { 'd', 'e', 'f', '\0' }; // null terminator required 

または

char b[] = "def"; // null terminator added automatically 

ので、このコードは、出力

iの出力として "defabc" を参照してくださいいけない
#include <stdio.h> 

int main() { 
    char a[] = "abc"; 
    char b[] = { 'd', 'e', 'f', '\0' }; 
    printf("%s", b); 
    return 0; 
} 
+0

OK私は理解しています.thx – Pulsar