C语言字符指针数组交换问题

在C语言中,指针数组中的指针变量可以实现交换吗?我不清楚是我的代码问题,还是C语言本身就不支持指针数组中指针位置的交换,下面的交换得不到想要的结果。
如题

#include <stdio.h>
#include <string.h>
#include <iostream>
#define MAXLEN 1000
using namespace std;

//字符串交换
void str_swap1(char **str1, char **str2){
    char *temp;
    temp = *str1;  //此时temp指向了*str1指针变量地址
    *str1 = *str2;   //形参中**str1是指向*str1指针的指针,*str1指针变量地址修改成了*str2指针变量地址
    *str2 = temp;  //形参中**str2是指向*str2指针的指针,*str2指针变量地址修改成了temp指针变量地址
}

//字符串按字典排序
void arr_sort(char *arr[], int len){

    int i,j;
    //插入排序
    for(i = 1; i < len; ++i){
        int index = 0;
        for(j = i; j > 0; --j){
            if(strcmp(arr[j - 1], arr[j]) > 0){
               
                int k = 0;
                cout << "交换前";
                for(k = 0; k < len; ++k){
                    cout << arr[k] << " ";
                }
                
                char *temp = arr[j - 1];
                char *temp1 = arr[j];
                str_swap1(&temp,&temp1);  //传入指针变量的地址
                printf(" swap: %s, %s",temp,temp1);

                cout << "交换后";
                for(k = 0; k < len; ++k){
                    cout << arr[k] << " ";
                }
                cout << endl;
            }
        }
    }
}

int main()
{
    int num,i;
    char *arr[num];  //字符串数组
    char str[MAXLEN];  //输入的字符串

    scanf("%d",&num);
    printf("输入%d个单词\n",num);
    for(i = 0; i < num; ++i){
       arr[i] = (char *) malloc(sizeof(char) * MAXLEN);   //如果未给arr[i]分配空间,scanf会报错:segmentation fault
       scanf("%s",arr[i]);
    }
    
    // printf("输入字符串\n");
    // scanf("%s",str);

    int j;
    cout << "排序前:" << endl;
    for(i = 0; i < num; ++i){
        cout << arr[i] << endl;
    }

    arr_sort(arr,num);

    cout << "排序后:" << endl;
    for(i = 0; i < num; ++i){
        cout << arr[i] << endl;
    }

    return 0;
}

输出结果为:

3
输入3个单词
peach
banana
apple
排序前:
peach
banana
apple
交换前peach banana apple  swap: banana, peach交换后peach banana apple 
交换前peach banana apple  swap: apple, banana交换后peach banana apple
交换前peach banana apple  swap: banana, peach交换后peach banana apple
排序后:
peach
banana
apple

下面是我的理解,供参考:
应该是swap函数的参数传递错误,把字符指针temp1和temp2的地址传入swap函数,交换的只是交换字符指针temp1和temp2的值,temp1和temp2里面的值虽然和数组元素相同,但是他们各自的地址却代表不同的含义,然后对这个地址的解引用操作涉及的对象也不同,所以二者不能替代,交换temp1和temp2的值不是交换字符串数组的元素的值,把相应字符串数组的元素的地址传入swap函数就可以了。
代码修改如下:

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <stdlib.h> 
#define MAXLEN 1000
using namespace std;
 
//字符串交换
void str_swap1(char **str1, char **str2){
    char *temp;
    temp = *str1;  //此时temp指向了*str1指针变量地址
    *str1 = *str2;   //形参中**str1是指向*str1指针的指针,*str1指针变量地址修改成了*str2指针变量地址
    *str2 = temp;  //形参中**str2是指向*str2指针的指针,*str2指针变量地址修改成了temp指针变量地址
}
 
//字符串按字典排序
void arr_sort(char *arr[], int len){
 
    int i,j;
    //插入排序
    for(i = 1; i < len; ++i){
        int index = 0;
        for(j = i; j > 0; --j){
            if(strcmp(arr[j - 1], arr[j]) > 0){
               
                int k = 0;
                cout << "交换前";
                for(k = 0; k < len; ++k){
                    cout << arr[k] << " ";
                }
//                
//                char *temp = arr[j - 1];
//                char *temp1 = arr[j];
                str_swap1(&arr[j-1],&arr[j]);  //传入指针变量的地址
               
//               char * temp = arr[j-1];
//               arr[j-1]=arr[j];
//               arr[j]=temp;
               
              //  printf(" swap: %s, %s",temp,temp1);
 
                cout << "交换后";
                for(k = 0; k < len; ++k){
                    cout << arr[k] << " ";
                }
                cout << endl;
            }
        }
    }
}
 
int main()
{
    int num,i;
    char *arr[num];  //字符串数组
    char str[MAXLEN];  //输入的字符串
 
    scanf("%d",&num);
    printf("输入%d个单词\n",num);
    for(i = 0; i < num; ++i){
       arr[i] = (char *) malloc(sizeof(char) * MAXLEN);   //如果未给arr[i]分配空间,scanf会报错:segmentation fault
       scanf("%s",arr[i]);
    }
    
    // printf("输入字符串\n");
    // scanf("%s",str);
 
    int j;
    cout << "排序前:" << endl;
    for(i = 0; i < num; ++i){
        cout << arr[i] << endl;
    }
 
    arr_sort(arr,num);
 
    cout << "排序后:" << endl;
    for(i = 0; i < num; ++i){
        cout << arr[i] << endl;
    }
 
    return 0;
}

img