ループが配列の最後を通り過ぎています。それがセグメンテーション違反の原因です。C では、初期化されていない変数が NULL になるという保証はありません。したがって、存在しないargvalues [11]にアクセスしようとするまで、ループはループし続けます。したがって、セグメンテーション違反です。
while (argvalues[i] != NULL) {
if (argvalues[i] == NULL){
この二つは互いに矛盾しています。argvalues[i] == NULL であることを発見すると while ループが最初に終了するため、if ステートメントに到達することさえありません。そして、10 個すべての引数が設定されている場合、argvalues[11] にアクセスしようとすると、前述のように segfault が発生します。
strcat を適切に使用するには、連結する文字列を末尾に受け入れるのに十分な大きさの文字列バッファが必要です。たとえば、既に "hello" を含むバッファーに " world" を追加する場合、hello バッファーは、少なくとも "hello"+" world" にさらに 1 文字 ('\0'最後に)。
// Here's an example.
char buffer[12];
strcpy(buffer, "hello");
strcat(buffer, " world");
これを行おうとすると、失敗します。
// Buffer isn't big enough to copy into.
char buffer[] = "hello";
strcat(buffer, " world");
何をしているのかを正確に把握するには、もう少し説明とコードが必要です。引数に null ターミネータを追加するのに最適な場所は、引数が最初に設定されるときです。引数の設定方法によっては、すでに発生している可能性があります。