誰かが投稿したこの最近の質問があります。リンクは次のとおりです。
奇妙な方法でソートされた出力
私はそれがどのように間違っているかを知っていますが、私が理解しようとしているのは、なぜそれがそのままの出力を生成するのですか?
に変更getch()
した後getchar()
、コンパイルして数回実行しました。常に変化しますfirst 4 letters
。where
この変更が実際にコードで行われることはわかりません。
どんな助けでも大歓迎です。
誰かが投稿したこの最近の質問があります。リンクは次のとおりです。
奇妙な方法でソートされた出力
私はそれがどのように間違っているかを知っていますが、私が理解しようとしているのは、なぜそれがそのままの出力を生成するのですか?
に変更getch()
した後getchar()
、コンパイルして数回実行しました。常に変化しますfirst 4 letters
。where
この変更が実際にコードで行われることはわかりません。
どんな助けでも大歓迎です。
これは次のswap
関数で発生します。
//swapping function
void swap(char **first, char **second)
...
OPは「char *」が整数型であると想定しており、それを移動すると文字列が移動します。2 番目の部分は、この swap 関数は、実際のデータではなく、データへのポインターを受け入れる必要があるということです。データのアドレスを交換し、データ自体には触れません。
ただし、で呼び出すとchar * *
、うまくいきません。これは、「a pointer to」のアドレスでデータをスワップします。しかし、入力は「ポインターからポインターへ」ではありませんでした。
「へのポインター」にはsizeof int
ほとんどのシステムがあります (「ほとんど」は主観的な評価です。ディスカッションや意見については、「ポインターのサイズ」を検索してください)。したがって、このルーチンは文字列または文字列へのポインタではなく、ターゲット アドレスで整数をスワップします。結果によると、整数は OP のマシン上で 4 バイトの長さであるため、コードはターゲット文字列の最初の 4 バイトを「交換」します。
swap()
OP 投稿
の誤った関数で変更が行われる出力が奇妙な方法でソートされる
char *temp;
...
void swap(char **first, char **second) {
temp = *second; // Copy 4-byte pointer
*second = *first;// Copy 4-byte pointer
*first = temp; // Copy 4-byte pointer
}