問題タブ [strdup]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - strdupを使用して文字列から変換されたc ++ char *は、元の生の文字列と等しくありません
私が疑問に思っているのは、文字列を char* に変換すると、新しい char* が元のリテラル文字列と等しくないように見える理由です。
私が持っている場合:
生成:
したがって、変換された char* は元の文字列と同じままです。しかし、何らかの理由char* s_convert
で、元のリテラル文字列と等しくありませんが、元の文字列はstring s
そうです。
なぜこれが起こるのですか?そして、これを引き起こさない文字列を char* に変換できるより良い方法はありますか?
strdup - _strdup を _strdup に置き換えます
VS2013 で次のコンパイル エラーが発生しました。
したがって、「_strdup」を同じものに置き換えるように求められます。
_strdup (POSIX) を strdup に置き換えるよう求めるエラーが多数見られますが、そうではありません。
また、同じコードが他の多くの人のマシンでも動作します (通常は同じプロジェクト プロパティを使用)。したがって、コードを変更する必要はないと思いますが、PC で何かを変更する必要があります。
何か案が ?
c - SDL_strdup などを使用してファイル名を取得する際の問題
SDL2でプログラムを作成しようとしています。
コードの特定の部分で、指定されたディレクトリ パスに存在するすべてのファイルの名前を取得する関数を作成し (それらをメモリに保持する)、別の関数で、指定されたファイルが最後に存在したかどうかを確認できるようにします。ディレクトリがチェックされた瞬間。私はdirent.h
自分のニーズに合わせて使用していますが、いくつかの問題が発生しています。
- すべてのファイルは (例外なく) によって適切にキャプチャされますが、使用後に常に適切にメモリにコピーされる
readdir()
とは限りません(コードは以下にあります)。SDL_strdup()
SDL_malloc()
/SDL_realloc()
/を使用してSDL_strdup()
、コードを移植するときに問題が発生しないように、可能な限りクロスプラットフォームにしています (strdup は C 標準ではないことを読んだため)。
これが私のコードです:
}
出力が異なります。クラッシュしない場合は、すべてのファイル名が正しくコピーされるか、ほとんどがコピーされ、一部には何も含まれていないか、意味不明な内容が含まれています (コメントされているように)。クラッシュした場合、使用中に Segfault が発生することもあれば、使用中に Segfault が発生することもありSDL_strdup()
ますclosedir()
。
ファイルの数を指定することで (別の関数のおかげで)SDL_realloc()
の初期メモリ割り当てでシナリオを交換することも検討しましたが、同じ問題が発生します。filelist->files
私のコーディング スタイルをより防御的なスタイルに変更する提案があれば (これはかなり危険だと私は信じているため) 歓迎しますが、この場合のためにできることはすべて試しました。現在、組み込みの gcc Apple LLVM 6.0 (clang-600.0.56) を使用して Mac OS X で作業しています。
c - char の配列を複製するとき、strdup は '\0' を追加していますか?
src配列に含まれていない場合、strdupが新しい配列の最後に「\ 0」を追加するかどうかを知りたいですか?
この種のmallocによって割り当てられた「hello」を含む配列があると仮定しましょう
つまり、5 文字で 5 バイトです。
src 文字列が '\0' に十分なメモリを受け取っていないと思います。
この場合、何が起こるはずですか?
c - C の char *str="this is a string" と char *str = strdup("this is a string") の違いは何ですか
次のコードの違いは何ですか:
char* str = "this is a string"
この 1 つから:
char* str = strdup("this is a string")
使用シナリオは?
c - strdup() で割り当てられた文字列を flex/bison から解放する
を使用して文字列語彙素をコピーするフレックス コードがありますstrdup()
。
strdup()
メモリを割り当て、入力文字列をそれにコピーして返す ( strdup() - C では何をしますか? ) ため、不要になったら解放する必要があると思います。
この投稿から: BISON で %destructor が呼び出されるのはいつですか? %destructor { free($$); printf("free");} STRING
、 yacc ファイルに追加しました。
ただし、から返された新しい文字列が に割り当てられfree()
ている場合でも、 が呼び出されることはありません。yylval.sval
strdup()
何が間違っている可能性がありますか? フレックス/バイソンで割り当てられた文字列を解放する方法は?
追加した
次のように静的に割り当てられた sval を使用することを考えます。
フレックスコードは次のようになります (yytext が 100 バイト未満の場合はチェックコードなし):
このアプローチが人々が通常使用するものであるかどうかはわかりません。
追加2
私のアプリケーションでは、簡単なインターンシップで問題ありません。
yacc コードの場合