"string" 在 C 中的通用交换

Generic swapping of "string" in C

我正在观看有关如何使用 memcpy()strdup() 进行 通用 交换的视频讲座。

通用交换代码如下:

void GenericSwap(void* ptr1, void* ptr2, int size){

    char buf[size];
    memcpy(buf,ptr1,size);
    memcpy(ptr1,ptr2,size);
    memcpy(ptr2,buf,size);
}

我们这样称呼它:

char* h = strdup("fred");
char* w = strdup("wilma");
GenericSwap(&h,&w,sizeof(char*));
printf("h : %s\nw : %s\n\n",h,w);

这将 "fred" 和 "wilma" 作为一个完整的字符串进行了交换。也就是说,现在h指向"wilma",w指向"fred"。

但是,当我将代码更改为:

char h1[10] = "fred";
char w1[10] = "wilma";
GenericSwap(&h1,&w1,sizeof(char*));
printf("h1 : %s\nw1 : %s\n",h1,w1);

我得到 "wilm" 和 "freda" h1w1。我正在传递保存数组第一个元素地址的东西的地址,就像顶部的正确工作代码一样,但这不像顶部那样工作得很好。

h1w1 只是指针,而不是指针对指针?

您正在尝试更改数组的地址,但您不能这样做。数组变量充当 const 指向其数据的指针,无法更改。

相反,您要交换前 sizeof (char *) 个(在您的系统上似乎是 4 个)字符。

基本上是为了

char h[8] = "foo";

两种说法

printf("%p\n", (void *) h);

printf("%p\n", (void *) &h);

将打印 相同的 地址,即表达式 &h 的计算结果为第一个元素的地址,就像 h 一样。没有单独的变量保存数组的地址,供您更改。