文字列のヌル終了が機能していないようです

アミカスを恨む

これらの2つのバージョンでは:

//VERSION 1
char *c=malloc(10);
c[0]='h';
c[1]='i';
c[2]='\0';
c[3]='l';

printf("%s\n",c);

期待どおりの結果が得られていhiます。つまり、印刷されています。

今これで:

//VERSION 2
char *c;
size_t siz=8;

c=malloc(sizeof(char)*(siz+1));  //char size is 1 byte on system

getline(&c,&siz,stdin);
c[siz]='\0';
printf("%s\n",c);

上の入力値「ハローワールド」を出力するには、「ハロー世界である-私はそれが(それがに設定されている9バイト目を読んだ後、何も印刷されないことを期待していました\0)。

なぜ2つに違いがあるのですか?

cバージョン2のポインターがポイントするように作成されてstdinおり、「\ 0」の変更がストリーム内でそのように機能しないために発生していますか?はいの場合、コンパイラが警告またはエラーを発行するのはなぜですか?

ウン

コメントであなた自身が指摘したようにgetline、ストリームからの行が指定されたバッファのサイズを超えた場合にバッファを再割り当て(または割り当て)する必要があるかどうかを確認するためにポインタとサイズの引数をチェックします(NULLサイズ0のバッファはプレーンです)再割り当ての代わりに割り当て)。これが発生すると、新しいバッファーに一致するようにポインターとサイズの両方の引数が変更されます(引数自体だけでなく、値ではなくバッファーポインターとサイズの引数にポインターを渡したことに注意してください)。

したがって、あなたの例では、サイズ9文字(あなたの場合は9バイト)のバッファを割り当てた後。あなたのcポインタが少なくとも9でいくつかのメモリに設定されている利用可能なバイトとsiz同じように長い(改行を含む)8文字以上の行を入力した後、しかし、まだ8で"hello world\n"バッファが文字列全体に合うように再割り当てされ、"hello world\n\0"すなわち13バイト、 ANDサイズ引数は13に変更されます。したがって、がgetline戻ると、cこの新しいバッファを指し、siz13になります。nullの終了を追加する必要はありませんgetline(成功した場合)。次に、バッファの終わりを超えてアクセスしているときに(文字列を作成して例外をトリガーしなかった設定c[13]'\0'行います"hello world\n\0\0"

探している結果については、マクロのように、元のサイズを脇に置いておきます。

#define SIZE 8
char* c;
size_t siz = SIZE;
c = malloc(sizeof(char) * (siz +1));
getline(&c, &siz, stdin); // if you type something longer than 8 bytes including new line, it will trigger the realloc and siz will be changed
c[SIZE] = '\0'; // prematurely end the string at 8 bytes
printed("%s\n", c); // now you'll get shorter strings, noting siz will still keep the full length for you

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

部分文字列が機能していないようです

分類Dev

文字列の置換が機能していないようです

分類Dev

配列のループが機能していないようです

分類Dev

スレッドの終了が機能していないようです

分類Dev

Firebase RealtimeequalToが「+123」のような文字列で機能しない

分類Dev

文字列の連結が期待どおりに機能しないようです

分類Dev

PHPForループが機能していないようです

分類Dev

Angularjsルートが機能していないようです

分類Dev

レルムが機能していないようです

分類Dev

環境内でのリレベルが機能していないようです

分類Dev

私の範囲のセル参照が機能していないようです

分類Dev

小道具付きの配列フィルターが正しく機能していないようです

分類Dev

AdapterのnotifyDataSetChanged()が機能していないようです

分類Dev

背景の移動が機能していないようです

分類Dev

ListViewの更新が機能していないようです

分類Dev

DjangoのURLが機能していないようです

分類Dev

UIToolBarのUIButtonが機能していないようです

分類Dev

Pythonのログレベルが機能していないようです

分類Dev

ルート.phpのLaravelredirect()が機能していないようです。

分類Dev

ループがヌル文字か何かをコピーすることを期待していましたが、最初から文字をコピーします。何故ですか?このループはどのように機能しますか?

分類Dev

クエリ文字列を使用したリダイレクト301が機能していないようです

分類Dev

文字列を比較しながらループが機能していないのですか?

分類Dev

sedが期待どおりに機能しない(文字列内の2つの一致の間で値を取得しようとしています)

分類Dev

関数後のjQueryがテーブルに対して正しく機能していないようです

分類Dev

jquery-最も近いものが機能していないようです

分類Dev

FieldQuotedが正しく機能していないようです

分類Dev

Summarise()が正しく機能していないようです

分類Dev

setOnPreferenceChangedListenerが正しく機能していないようです

分類Dev

MySQLUNIONが正しく機能していないようです

Related 関連記事

  1. 1

    部分文字列が機能していないようです

  2. 2

    文字列の置換が機能していないようです

  3. 3

    配列のループが機能していないようです

  4. 4

    スレッドの終了が機能していないようです

  5. 5

    Firebase RealtimeequalToが「+123」のような文字列で機能しない

  6. 6

    文字列の連結が期待どおりに機能しないようです

  7. 7

    PHPForループが機能していないようです

  8. 8

    Angularjsルートが機能していないようです

  9. 9

    レルムが機能していないようです

  10. 10

    環境内でのリレベルが機能していないようです

  11. 11

    私の範囲のセル参照が機能していないようです

  12. 12

    小道具付きの配列フィルターが正しく機能していないようです

  13. 13

    AdapterのnotifyDataSetChanged()が機能していないようです

  14. 14

    背景の移動が機能していないようです

  15. 15

    ListViewの更新が機能していないようです

  16. 16

    DjangoのURLが機能していないようです

  17. 17

    UIToolBarのUIButtonが機能していないようです

  18. 18

    Pythonのログレベルが機能していないようです

  19. 19

    ルート.phpのLaravelredirect()が機能していないようです。

  20. 20

    ループがヌル文字か何かをコピーすることを期待していましたが、最初から文字をコピーします。何故ですか?このループはどのように機能しますか?

  21. 21

    クエリ文字列を使用したリダイレクト301が機能していないようです

  22. 22

    文字列を比較しながらループが機能していないのですか?

  23. 23

    sedが期待どおりに機能しない(文字列内の2つの一致の間で値を取得しようとしています)

  24. 24

    関数後のjQueryがテーブルに対して正しく機能していないようです

  25. 25

    jquery-最も近いものが機能していないようです

  26. 26

    FieldQuotedが正しく機能していないようです

  27. 27

    Summarise()が正しく機能していないようです

  28. 28

    setOnPreferenceChangedListenerが正しく機能していないようです

  29. 29

    MySQLUNIONが正しく機能していないようです

ホットタグ

アーカイブ