入力された char* の長い方を返し、それをコンソールに出力する単純な関数を作成しました。両方の char* が等しい場合でも、何らかの形でセグメンテーション違反が発生することが予想されますが、毎回 2 番目の char* がコンソールに出力されます。これはコンパイラの最適化の一種ですか、それとも何か不足していますか?
サンプル入力: ./longer test test
2 番目の「テスト」(argv[2]) を出力します。
好奇心からclangとgccの両方を試してみましたが、同じ結果でした。
#include<stdio.h>
char* longer(char *, char *);
int main(int argc, char *argv[]) {
printf("%s", longer(argv[1], argv[2]));
return 0;
}
char* longer(char* s1, char* s2) {
char *first, *second;
for(first = s1, second = s2; *s1 && *s2; s1++, s2++);
return *s1 > *s2 ? first : second;
}
明確にするために、null バイトでループが壊れているため、長い関数は現在の位置の ascii 値を比較しています。本質的に、比較は 0 > 0 ですよね?