C ++、文字列のいくつかの小さなトラップに陥っていますか

  C ++で開発されたプロジェクトは、必然的にSTL文字列を使用します。これは、char配列(ポインター)よりも使用および管理がはるかに便利です。ただし、プロジェクトのバグを回避するために、便利な使用プロセス中にいくつかの小さな落とし穴に注意する必要がありますが、見つかりません。原因に。
  
  1.構造内の文字列割り当ての問題は
  
  、例によって直接説明されます。次の例の出力は、
  
  bubuko.com、布布tt
  
  #include <iostream>
  
  #include <string>
  
  #include <stdlib.h>
  
  using namespace std;
  
  struct flowRecord
  
  {
  
  string app_name;
  
  struct flowRecord * next;
  
  };
  
  int main(){
  
  flowRecord * fr =(flowRecord *)malloc(sizeof(flowRecord));
  
  fr-> app_name = "hello";
  
  out << fr-> app_name << endl;
  
  return 0;
  
  }
  
  bubuko.com、布ボタン
  
  もちろん、ええと、それは単に「hello」を出力するだけではなく、Linuxでg ++の下でコンパイルして実行しようとすると、「セグメンテーション違反(コアダンプ)」が表示されるのはなぜですか?問題は、frポインターにメモリを割り当てるときです。Cではmallocがnewではなく使用されていることに注意してください。newに変更して再度実行しても、エラーは報告されません。「hello」が正常に出力された場合、mallocはなぜですかできない?これは、malloc()とnew()の違いに依存します。この2つの違いは、プログラマーインタビューでよく聞かれる古典的なインタビューの質問なので、通常のプログラマーには非常に重要な違いがあることを知っています。つまり、newはメモリを割り当てるときにデフォルトのコンストラクターを呼び出しますが、mallocは呼び出しません。STL文字列は、割り当て、印刷、その他の操作などの割り当ての前に、文字列を初期化するためにデフォルトコンストラクターを呼び出す必要があります。mallocを使用してメモリを割り当てる場合、構造体のapp_name文字を初期化するために文字列のデフォルトコンストラクターは呼び出されません。文字列なので、ここで直接割り当てるのは誤りです。新しい演算子を使用する必要があります。これはまた、C ++でプログラムを開発するときは、C ++で関数をできるだけ使用することを思い出させます。C++とCプログラミングを混在させないでください。これは混乱を招きます。たとえば、newによって割り当てられたメモリが解放されて解放される場合があります。
  
  2. c_str()関数の問題
  
  c_str()関数は文字列とconst char *の間の変換に使用され、よく使用されます次の例の出力についてどう思いますか?
  
  bubuko.com、布布
  
  #include <iostream>
  
  #include <string>
  
  using namespace std;
  
  int main(){
  
  string s = "Alexia";
  
  const char * str = s.c_str();
  
  cout << str << endl;
  
  s [1] = 'm';
  
  cout << str << endl;
  
  return 0;
  
  }
  
  bubuko.com、Bubukou
  
  。最初のものは言うまでもなく、2番目の出力は「アレクシア」または「アメキシア」?答えは後者です。一見すると、const char *の値は定数である必要があります。どのように変更できますか?ハ、もう1つの古典的なインタビューの質問:const char *、char const *、char * constの違いは何ですか?古い質問のconst char *とchar const *は同等であり、文字定数へのポインターを参照しています。つまり、ポインターは変更できませんが、ポインターが指す内容は変更できますが、char * constは反対で、定数ポインターを参照します。ポインターは変更できますが、ポインターが指す内容は変更できません。したがって、const char *が指すコンテンツは変更される可能性がありますが、なぜ変更されたのですか?これは、const char * strのライフサイクルと文字列クラスの実装に関連しています。文字列のc_str()によって返されるポインターは文字列によって管理されるため、その有効期間は文字列オブジェクトの有効期間であり、文字列クラスの実装は実際にはchar *ポインターをカプセル化し、c_str()はポインターの参照を直接返すため、文字列オブジェクトの変更は、実行されたc_str()によって返されるポインター参照に直接影響します。
  
  3.文字列リテラル値は、標準ライブラリ文字列と同じタイプではありません。
  
  次の例を直接参照してください:
  
  string s( "hello");
  
  cout << s.size()<< endl; // OK
  
  cout << "hello"。サイズ()<< endl;
  
  cout << s + "world" << endl; // OK
  
  cout << "hello" + "world" << endl; // ERROR
  
  は、2つが非常に異なっており、混同できないことを示しています。

おすすめ

転載: www.cnblogs.com/zhenhua1618/p/12729488.html