他の人があなたのコードを見通しに入れるためにあなたがやろうとしていることを言ったら、それは素晴らしいことかもしれません。
今、あなたはポインタがどのように機能するかをよく理解していないようです。あなたのコードは本当に読みやすいものではないので、答えは一般的です。
ポインタはアドレスをメモリに「保持」します。ptr1
メモリブロックA
を指すポインタと、をptr2
指すポインタがある場合ptr1
、を変更するとptr1
、当然ptr2
同じ変更が発生します。someVar
コードの最初のブロックでは、変更後に変更される理由を理解していないようですotherVar
。@dmpが指摘したことをより明確にするために、でsomeVar
保持されている値を指すプログラム(オペレーティングシステムがプログラムのメモリを管理している)を指定しましたotherVar[0]
。これで、otherVar[0]
変更すると、someVar
ポインタが機能することになっているため、変更されます。ポインタが指すものの値を要求すると、ポインタを逆参照するように呼び出されます。ptr2
。ですから、ポインタについてもう一度お読みください。
コードの2番目のブロックでは、何を達成しようとしているのかわかりませんが、それが何であれ、実行されますSEGFAULT
。これも、ポインタ、配列の関係、および動的メモリ割り当てがどのように機能するかを理解していないためです。たとえば、splittext
関数には次の行があります。
wchar_t *arr[2],*loc = wcsstr(stri, del), buf[DEFAULT_BUFLEN];
すぐそこに:*arr
メモリを割り当てていないときに、の3番目のセルの値を確認するようにオペレーティングシステムに指示します。また、メモリを割り当てるときは、次の点に注意してください。
- 文字列を取得するためにメモリを割り当てたい場合
char
、ポインタは次のchar
ようなポインタである必要があります。
char* my_string = malloc( 256*sizeof(char))
次に、タイプの変数へのポインタに割り当てられたメモリを取得しますFILE*
。あなたが書くならば、FILE** my_files = malloc( NUMBER_OF_FILES*sizeof(FILE))
それはあなたを困らせるでしょう。むしろ書く:
FILE** my_files = malloc( NUMBER_OF_FILES*sizeof(FILE*))
これは、たとえばメモリをどのように割り当てたかに関するものですarr
。
- また、の戻り値をキャストしないで
malloc
ください。コンパイラがキャッチした可能性のある多くのエラーを非表示にします。
要約すると、ポインタ、配列、およびメモリ割り当ての少し高度な使用法に進む前に、まずポインタについて学習してみてください。次に、間違ったコードを入れて(コンパイルされないか、クラッシュするだけで間違っていることがわかります)、他の人に「その変数を見てください。私の問題があります」と言うことはできません。質問についてさらに調査を行い、どのツールが役立つか(この場合はデバッガー)を学習してみてください。これにより、質問の品質が向上します。最後に、英語があなたの第一言語でない場合、あなたはそれについて言及することができ、他の人はあなたの質問を再定式化するのを喜んで手伝ってくれるでしょう。
次回はもっと上手くいくことを願っています!
アップデート
OPによる編集後、質問はより明確になり、OPの問題はポインターに関するものになりました。
dd
の値は次の理由で変化します:
aaa
は次のようなポインタです:char aaa[500]
と同等char* aaa = malloc(500*sizeof(char))
です。ここで、と同じメモリアドレスを指すようdd=aaa
にコンパイラに指示しました。したがって、変更するたびに、メモリ内の同じものを指しているため、変更されます。dd
aaa
aaa
dd
それが明確でない場合は、ポインターの定義を読み直してみてください。